App Engine - Cloud Sql - java.sql.SQLException:此Connection已关闭

时间:2012-11-06 19:10:15

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

过了一段时间我得到了这个错误,那么在给我的单身人士之前如何确保连接没有死?

这是我的代码:

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:此Connection已关闭。在   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)at   controller.CtrlUser.login(CtrlUser.java:343)at   vidaao.ConnectServlet.doPost(ConnectServlet.java:36)at   javax.servlet.http.HttpServlet.service(HttpServlet.java:637)at at   javax.servlet.http.HttpServlet.service(HttpServlet.java:717)at at   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)at   org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)at at   org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)at at   org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)     在   org.mortbay.thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool.java:582)

我尝试使用isClosed()但是不起作用,而且isValid()看起来它正在工作,但它每次都减慢了与数据库的连接

1 个答案:

答案 0 :(得分:2)

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

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

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

希望这有帮助, 罗布