2012-11-06 41 views
3

經過一段時間,我得到了這個錯誤,那麼如何在給予我的單例之前確保連接沒有死亡?App Engine - Cloud Sql - java.sql.SQLException:此連接已關閉

這裏是我的代碼:

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) at com.google.cloud.sql.jdbc.Connection.createStatement(Connection.java:123) at com.google。 cloud.sql.jdbc.Connection.createStatement(Connection.java:54) at db.DbUser.exist(DbUser.java:209)at controller.CtrlUser.login(CtrlUser.java:343)at vidaao.ConnectServlet。 doPost(ConnectServlet.java:36) javax.servlet.http.HttpServlet.s ervice(HttpServlet.java:637)處 org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)在 組織.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter在 org.mortbay在 com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)(ServletHandler.java:1166) .jetty.servlet.ServletHandler $ CachedChain.doFilter在 org.mortbay.jetty.servlet在 com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:110)(ServletHandler.java:1157) .ServletHandler $ CachedChain.doFilter(S ervletHandler.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) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at 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) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Se rver.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 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool.java:582)

我試圖用isClosed(),但不工作,isValid()的看起來是工作,但它的每一次

+0

沒有很難猜測到底是怎麼回事堆棧跟蹤。 – kosa

+0

在這裏我附上了我的堆棧跟蹤@Nambari –

回答

2

調用Connection#isValid將是最好的辦法減緩到數據庫的連接,但沒錯,它坪數據庫確保連接有效。

我注意到你沒有使用AppEngine中的標準mysql連接器/ j驅動程序,我建議試試這個。它不會像舊版驅動程序那樣使服務器上的連接超時。

有關要在AppEngine中使用的JDBC驅動程序類的類名以及要使用的URL,請參見https://developers.google.com/appengine/docs/java/cloud-sql/#Java_Connect_to_your_database

希望這有助於 羅布

+0

謝謝,我剛剛實施了這個,我會在生產中投入幾天,看看它是否會解決問題! –

相關問題