我得到了可怕的MySQL JDBC陈旧连接异常:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 243,263,541 milliseconds ago. The last packet sent successfully to the server was 243,263,541 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
Run Code Online (Sandbox Code Playgroud)
似乎每个人都认为这是通过使用validationQuery + testOnBorrow来解决的,但这并不能解决问题.
我使用以下软件MySQL 5.1.41-3ubuntu12.10 Connector/J 5.1.18 Tomcat 6.0.24
以下是如何在server.xml中定义连接,我们使用tomcat-dbcp来连接池.
<Resource
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
logAbandoned="true"
maxActive="75"
maxIdle="20"
maxWait="10000"
name="jdbc/jndiname"
password="password"
removeAbandoned="true"
removeAbandonedTimeout="60"
validationQuery="/* ping */SELECT 1"
testOnBorrow="true"
testOnReturn="true"
timeBetweenEvictionRunsMillis="10000"
testWhileIdle="true"
scope="Shareable"
type="javax.sql.DataSource"
url="jdbc:mysql://host:3306/schema"
username="username" />
Run Code Online (Sandbox Code Playgroud)
我可能会检查您的 my.cnf 文件中的 wait_timeout 。默认值为 28800 秒或 8 小时。它的最大值为 31536000 秒或 365 天。
对于您注意到的第一个异常:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException,我过去将其包装在 try/catch 块中。在捕获中,对于该异常,我重新连接了连接,然后重新发送了查询。由于知道我不想经常这样做,并且仍然保持打开的连接,因此我还将默认的 wait_timeout 增加到适合我的应用程序的合理值。
请参阅手册参考:http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_wait_timeout
| 归档时间: |
|
| 查看次数: |
6523 次 |
| 最近记录: |