2016-08-08 26 views
0

Ich arbeite an einem Port unserer Webanwendung zu GAE und Google Cloud SQL. Ich verwende MySQL 5.6 und den DevAppServer lokal während der Entwicklung, und ich habe einige Abfragen, die länger als 5 Sekunden dauern, um zurückzukehren. Es scheint eine Art Standard-Timeout zu geben und die Abfrage schlägt nach etwa 5 Sekunden fehl. im DevAppServer. Ich habe noch nicht versucht, dies in GAE direkt auszuführen (hauptsächlich, weil ich die Seite nicht vervollständigen kann, weil die Abfrage weiterhin fehlschlägt). HierGAE DevAppServer tötet gewaltsam meine MySQL-Verbindung nach 5 Sekunden

ist der Call-Stack:

Aug 08, 2016 10:34:05 AM org.glassfish.jersey.server.ServerRuntime$Responder mapException 
FINER: Starting mapping of the exception. 
org.glassfish.jersey.server.internal.process.MappableException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet successfully received from the server was 5,006 milliseconds ago. The last packet sent successfully to the server was 5,001 milliseconds ago. 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.mapTargetToRuntimeEx(AbstractJavaResourceMethodDispatcher.java:179) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.access$200(AbstractJavaResourceMethodDispatcher.java:72) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:149) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) 
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) 
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:128) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:50) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366) 
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349) 
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at 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) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:511) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet successfully received from the server was 5,006 milliseconds ago. The last packet sent successfully to the server was 5,001 milliseconds ago. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance_(Runtime.java:142) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance(Runtime.java:150) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:981) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3465) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3365) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3805) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861) 
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1962) 
    at com.mysql.jdbc.CallableStatement.executeQuery(CallableStatement.java:858) 
    at com.[redacted].[redacted].sql.SqlQuery.executeQuery(SqlQuery.java:132) 
    at com.[redacted].[redacted].business.user.InterfaceManager.performDQLSearch(InterfaceManager.java:216) 
    at com.[redacted].[redacted].business.user.InterfaceManager.performFilterSearch(InterfaceManager.java:275) 
    at com.[redacted].[redacted].rest.client.Search.searchFilter(Search.java:139) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:130) 
    at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) 
    ... 55 more 
Caused by: java.net.SocketException: Socket operation timed out: The API call remote_socket.Receive() took too long to respond and was cancelled. 
    at com.google.appengine.api.socket.SocketApiHelper.makeSyncCall(SocketApiHelper.java:76) 
    at com.google.appengine.api.socket.AppEngineSocketImpl.receive(AppEngineSocketImpl.java:710) 
    at com.google.appengine.api.socket.AppEngineSocketInputStream.read(AppEngineSocketInputStream.java:35) 
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:100) 
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:143) 
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:173) 
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2954) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3375) 
    ... 74 more 

Aug 08, 2016 10:34:05 AM com.[redacted].[redacted].rest.internal.GenericExceptionMapper toResponse 
SEVERE: Communications link failure 

The last packet successfully received from the server was 5,006 milliseconds ago. The last packet sent successfully to the server was 5,001 milliseconds ago. 
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet successfully received from the server was 5,006 milliseconds ago. The last packet sent successfully to the server was 5,001 milliseconds ago. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance_(Runtime.java:142) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance(Runtime.java:150) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:981) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3465) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3365) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3805) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861) 
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1962) 
    at com.mysql.jdbc.CallableStatement.executeQuery(CallableStatement.java:858) 
    at com.[redacted].[redacted].sql.SqlQuery.executeQuery(SqlQuery.java:132) 
    at com.[redacted].[redacted].business.user.InterfaceManager.performDQLSearch(InterfaceManager.java:216) 
    at com.[redacted].[redacted].business.user.InterfaceManager.performFilterSearch(InterfaceManager.java:275) 
    at com.[redacted].[redacted].rest.client.Search.searchFilter(Search.java:139) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:130) 
    at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) 
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) 
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:128) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:50) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366) 
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349) 
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at 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) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:511) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
Caused by: java.net.SocketException: Socket operation timed out: The API call remote_socket.Receive() took too long to respond and was cancelled. 
    at com.google.appengine.api.socket.SocketApiHelper.makeSyncCall(SocketApiHelper.java:76) 
    at com.google.appengine.api.socket.AppEngineSocketImpl.receive(AppEngineSocketImpl.java:710) 
    at com.google.appengine.api.socket.AppEngineSocketInputStream.read(AppEngineSocketInputStream.java:35) 
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:100) 
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:143) 
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:173) 
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2954) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3375) 
    ... 74 more 

Aug 08, 2016 10:34:05 AM com.[redacted].[redacted].rest.internal.ResponseUtils addCommonHeaders 
FINE: Set response header -> Access-Control-Allow-Origin: * 
Aug 08, 2016 10:34:05 AM org.glassfish.jersey.server.ServerRuntime$Responder mapException 
FINER: Exception 'Communications link failure 

The last packet successfully received from the server was 5,006 milliseconds ago. The last packet sent successfully to the server was 5,001 milliseconds ago.' has been mapped by 'com.[redacted].[redacted].rest.internal.GenericExceptionMapper' to response 'Internal Server Error' (500:SERVER_ERROR). 

Es konnte einen Haltepunkt in dem MySQL-Treiber-Code setzen und diese Ausnahme gefunden:

java.net.SocketException: Socket Operation timed out: Der API-Aufruf remote_socket.Receive() hat zu lange gedauert, um zu antworten, und wurde abgebrochen.

Socket-Operation abgelaufen: Der API-Aufruf remote_socket.Receive() dauerte zu lange, um zu antworten und wurde abgebrochen.

Jetzt habe ich versucht, den gleichen SP Anruf laufe meine Bibliothek Code außerhalb des GAE DevAppServer mit und es funktioniert gut:

package com.[redacted].poc.sql.TestSQL; 

import java.util.logging.Level; 
import java.util.logging.Logger; 

import org.apache.commons.lang3.time.StopWatch; 

import com.[redacted].[redacted].data.DataTable; 
import com.[redacted].[redacted].sql.AutoConnection; 
import com.[redacted].[redacted].sql.DatabaseManager; 
import com.[redacted].[redacted].sql.ResultSetEx; 
import com.[redacted].[redacted].sql.SqlIntegerParameter; 
import com.[redacted].[redacted].sql.SqlQuery; 
import com.[redacted].[redacted].sql.SqlStringParameter; 

/** 
* Hello world! 
* 
*/ 
public class App { 

    private static final Logger logger = Logger.getLogger(App.class.getName()); 

    public static void main(String[] args) { 
     try { 
      DatabaseManager.initialize("jdbc:mysql://127.0.0.1:3306/[redacted]?user=[redacted]&password=[redacted]"); 

      final String xml = [redacted]; 

      final StopWatch swTotal = new StopWatch(); 
      final StopWatch swRs1 = new StopWatch(); 
      final StopWatch swRs2 = new StopWatch(); 
      try (AutoConnection db = new AutoConnection(DatabaseManager.getDbConnection())) { 
       assert (db != null); 
       assert (db.getConnection() != null); 
       try (final SqlQuery sql = DatabaseManager.buildStoredProcedureCall(logger, db.getConnection(), 
         "text_search", new SqlIntegerParameter("user_id", Integer.valueOf(2)), 
         new SqlIntegerParameter("project_id", Integer.valueOf(2)), 
         new SqlStringParameter("search_criteria_xml", xml), new SqlIntegerParameter("page_number", 1), 
         new SqlIntegerParameter("page_size", 25))) { 
        logger.info("Running query"); 
        swTotal.start(); 
        swRs1.start(); 
        try (final ResultSetEx rs = new ResultSetEx(sql.executeQuery())) { 
         swRs1.stop(); 
         final DataTable dt = DatabaseManager.copyToDataTable(rs); 
         logger.info(String.format("Returned %d rows", dt.getTotalRows())); 

         boolean pagingOk = false; 

         if (sql.getMoreResults()) { 
          swRs2.start(); 
          try (final ResultSetEx rs2 = new ResultSetEx(sql.getResultSet())) { 
           swRs2.stop(); 
           if (rs2.next()) { 
            pagingOk = true; 

            final int totalRows = rs2.getInt("total_rows"); 
            final int lastPageNum = rs2.getInt("page_number"); 
            final int lastPageSize = rs2.getInt("page_size"); 
            final int totalPages = rs2.getInt("total_pages"); 
            final String searchXml = rs2.getString("search_criteria_xml"); 
            dt.setTotalRows(totalRows); 
            dt.setPageNumber(lastPageNum); 
            dt.setPageSize(lastPageSize); 
            dt.setTotalPages(totalPages); 
            dt.setSearchXml(searchXml); 
           } 
          } 
         } 
         if (!pagingOk) { 
          throw new Exception("Paging information results missing"); 
         } 
        } 
       } 
      } finally { 
       logger.info("Total elapsed time : " + swTotal.toString()); 
       logger.info("1st result set time :" + swRs1.toString()); 
       logger.info("2nd result set time :" + swRs2.toString()); 
      } 
     } catch (Exception ex) { 
      logger.log(Level.SEVERE, ex.getMessage(), ex); 
     } 
    } 
} 

Hier ist die Ausgabe:

Aug 08, 2016 10:42:46 AM com.[redacted].poc.sql.TestSQL.App main 
INFO: Running query 
Aug 08, 2016 10:42:55 AM com.[redacted].poc.sql.TestSQL.App main 
INFO: Returned 25 rows 
Aug 08, 2016 10:42:55 AM com.[redacted].poc.sql.TestSQL.App main 
INFO: Total elapsed time : 00:00:08.900 
Aug 08, 2016 10:42:55 AM com.[redacted].poc.sql.TestSQL.App main 
INFO: 1st result set time :00:00:08.876 
Aug 08, 2016 10:42:55 AM com.[redacted].poc.sql.TestSQL.App main 
INFO: 2nd result set time :00:00:00.000 

So scheint es mir, dass etwas innerhalb der GAE-Bibliothek zwangsweise die SQL-Verbindung auf der Socket-Ebene tötet. Die Anwendung muss das Abfrageergebnis verarbeiten, sodass ich es nicht ignorieren kann. Hat jemand eine Einstellung oder eine andere Möglichkeit gefunden, dieses Problem zu beheben? Ich habe die GAE-Dokumente im Nausium gelesen und viele Google-Suchen ohne Erfolg durchgeführt. Es scheint mir seltsam, dass es eine harte 5-Sekunden-Grenze für eine Abfrage gibt, die Sie nicht überschreiben können. Ich weiß, dass sie ein Maximum von 60 Sekunden für UrlFetch und Task Queue Anrufe erlauben, so hoffe ich, ich vermisse nur etwas ...

+0

Wahrscheinlich ist das ein Standard-Timeout, haben Sie eine Zeitüberschreitung angegeben? – marcadian

+0

Wenn Sie sorgfältig lesen, kann ich die gleiche Verbindungszeichenfolge zu der gleichen DB verwenden und die gleiche gespeicherte Prozedur ohne ein Problem außerhalb des DevAppServers in einer Test-Java-App ausführen. Ich habe auch die Standard-Timeouts auf dem MySQL-Server selbst überprüft, und keiner ist so nahe wie 10 Sekunden. Das würde natürlich Sinn machen, da ich den SP in einer Test-App gut laufen lassen kann, nur nicht über das GAE-SDK. EDIT: Ich benutze auch den gleichen Treiber in beiden Fällen, falls das nicht klar war. –

Antwort