2010-10-08 4 views
0

J'utilise BasicDatasource dans mon application. Cette application traite d'énormes quantités de données brutes. Parfois, une requête peut prendre plus de 15 minutes. (en utilisant mysql comme db)Problème de délai de connexion de base de données (en utilisant mysql)

Voici ma question, j'acquiers une connexion de pool, puis j'exécute plusieurs requêtes dessus. Mais quand j'utilise la même connexion plus de 15 minutes, j'obtiens l'erreur ci-dessous. Dans le serveur mysql, max_wait est défini sur 180 heures. Il ne devrait donc pas y avoir de problème pour maintenir la connexion active et aucune règle de pare-feu ne doit être définie pour tuer les connexions actives plus d'un certain temps.

Que me manque-t-il ici pensez-vous?

The last packet successfully received from the server was 928,374 milliseconds ago. The last packet sent successfully to the server was 928,374 milliseconds ago. 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 
     at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1118) 
     at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3055) 
     at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2941) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3489) 
     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) 
     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113) 
     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2562) 
     at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1664) 
     at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1583) 
     at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228) 
     at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228) 
     at com.adsclick.logs.cron.adsclickv261.global.ProcessBase.executeUpdate(ProcessBase.java:766) 

Répondre

3

Les choses que vous pouvez essayer:

  1. setMaxWait(-1) sur le BasicDataSource. Cela lui dit d'attendre indéfiniment une connexion.

  2. Vérifiez que le wait_timeout sur votre serveur MySQL est défini sur 8h par défaut.

  3. Set ?autoReconnect=true sur votre URL JDBC

  4. setTestOnBorrow(true) sur le BasicDataSource. Cela l'empêchera de distribuer des connexions périmées, mais ajoutera des frais supplémentaires à votre application (bien que si vous avez déjà des requêtes aussi longues, vous ne remarquerez probablement pas cette partie).

En général, je trouve une mauvaise idée de garder en réutilisant une connexion. Pour moi, le point d'avoir une piscine est que je n'ai pas à faire ça.

Vos requêtes sont-elles transactionnelles? Une requête vraiment longue verrouille-t-elle une table majeure?

+0

merci pour la réponse – WorM

Questions connexes