Basicdatasource连接超时问题(使用mysql)
我在我的应用程序中使用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)
你可以尝试的事情:
-
setMaxWait(-1)
上的setMaxWait(-1)
。 这告诉它无限期地等待连接。 -
检查MySQL服务器上的
wait_timeout
是否设置为默认值8h。 -
在JDBC URL上设置
?autoReconnect=true
-
setTestOnBorrow(true)
上的setTestOnBorrow(true)
。 这将阻止它分发过时的连接,但会增加你的应用程序的开销(虽然如果你已经有这么长的单个查询,你可能甚至不会注意到这一部分)。
一般来说,我发现继续重用连接是一个坏主意。 对我来说,拥有游泳池的关键是我不必那样做。
您的查询是事务性的吗? 是否有一些非常长的查询锁定了一个主要表?