【问题标题】:App Engine - Cloud Sql - java.sql.SQLException: This Connection is closedApp Engine - Cloud Sql - java.sql.SQLException:此连接已关闭
【发布时间】:2012-10-26 19:13:05
【问题描述】:

过了一会儿我得到了这个错误,那么在给我的单例之前如何确保连接没有死?

这是我的代码:

public static Connection getInstance() throws Exception {

    if(connection != null) {
        return connection;
    }

        DriverManager.registerDriver(new AppEngineDriver());
        connection = DriverManager.getConnection("jdbc:google:rdbms://"+instanceName+"/vidaao");

    return connection;

}

堆栈跟踪:

java.sql.SQLException:此连接已关闭。在 com.google.cloud.sql.jdbc.internal.Exceptions.newConnectionClosedException(Exceptions.java:52) 在 com.google.cloud.sql.jdbc.Connection.throwIfNotOpen(Connection.java:633) 在 com.google.cloud.sql.jdbc.Connection.getHoldability(Connection.java:194) 在 com.google.cloud.sql.jdbc.Connection.createStatement(Connection.java:123) 在 com.google.cloud.sql.jdbc.Connection.createStatement(Connection.java:54) 在 db.DbUser.exist(DbUser.java:209) 在 控制器.CtrlUser.login(CtrlUser.java:343) 在 vidaao.ConnectServlet.doPost(ConnectServlet.java:36) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 在 com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:110) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:61) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 在 org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 在 org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 在 com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:380) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 org.mortbay.jetty.Server.handle(Server.java:326) 在 org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 在 org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 在 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 在 org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

我尝试使用 isClosed() 但不起作用,并且 isValid() 看起来可以正常工作,但每次都会减慢与数据库的连接速度

【问题讨论】:

  • 没有堆栈跟踪很难猜出发生了什么。
  • 在这里我附上了我的堆栈跟踪@Nambari

标签: java database google-app-engine google-cloud-sql


【解决方案1】:

调用Connection#isValid 是最好的方法,但是是的,它会ping 数据库以确保连接有效。

我注意到您没有在 AppEngine 中使用标准的 mysql connector/j 驱动程序,我建议您尝试一下。它不会像旧驱动程序那样使服务器上的连接超时。

有关要在 AppEngine 中使用的 JDBC 驱动程序类的类名以及要使用的 URL,请参阅 https://developers.google.com/appengine/docs/java/cloud-sql/#Java_Connect_to_your_database

希望这会有所帮助, 抢

【讨论】:

  • 谢谢,我刚刚实现了这个,我会在生产中试一试,看看是否能解决问题!
猜你喜欢
  • 2017-11-11
  • 2015-11-03
  • 2014-09-19
  • 2014-07-19
  • 2020-06-07
  • 2016-07-01
  • 2011-08-02
  • 2019-07-27
相关资源
最近更新 更多