我在我的应用程序中使用BasicDatasource。此应用程序正在处理大量原始数据。有时1次查询可能需要15分钟以上。 (使用mysql作为db)
这是我的问题,我从池中获取连接,然后对其执行多个查询。但是当我使用相同的连接超过15分钟时,我得到以下错误。在mysql服务器中,max_wait设置为180小时,因此保持连接活动并且没有防火墙规则设置为终止超过一定时间的活动连接不应该是一个问题。
你觉得我在这里想念的是什么?
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)
答案 0 :(得分:3)
你可以尝试的事情:
setMaxWait(-1)
。这告诉它无限期地等待连接。
检查MySQL服务器上的wait_timeout
是否设置为默认值8h。
在JDBC URL上设置?autoReconnect=true
setTestOnBorrow(true)
。这样可以防止它发布过时的连接,但会增加你的应用程序的开销(尽管如果你已经有了这么长的单个查询,你可能甚至都不会注意到那个部分)。
总的来说,我发现继续重用连接是一个坏主意。对我来说,拥有游泳池的关键是我不必这样做。
您的查询是否具有交易性?是否有一些非常长的查询锁定主表?