我在这里检查了有关此主题的相关问题,并且还搜索了一段时间。似乎我仍然不了解Tomcat的DBCP配置或机制中的一些关键内容。
我在server.xml以下位置配置了Tomcat 6,DBCP资源:
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://myhost:3306/mydb?autoReconnectForPools=true&useUnicode=true"
username="user"
password="password"
validationQuery="SELECT 1"
testOnBorrow="true"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="10000" minEvictableIdleTimeMillis="60000"
maxActive="20" maxWait="20000" maxIdle="10"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" />
我也寻找mysql的wait_timeout,它是default 28800。
总而言之,我尝试了几种选择,但似乎问题在于mysql连接处于空闲状态时达到28800秒,服务器关闭了它们。我认为pool应该以某种方式使用validationQueryand
处理这种情况testOnBorrow,但似乎我错了。
如果在闲置时间后使用autoReconnect,url我的第一个查询尝试将导致“ ...CommunicationsException: The
last packet successfully received from the server was 157,493,261 milliseconds
ago.”,但此后它可以正常工作。
如果我使用autoReconnectForPools它url或只是不使用它-闲置时间(8小时)后,每次都会得到“
.MySQLNonTransientConnectionException: No operations allowed after connection
closed”。
在这两种情况下,当应用加载时,一切都会顺利进行。因此,我得出的结论是,连接是从mysql一侧关闭的。
帮助,我错过了什么?我想在不更改Mysql中的wait_timeout的情况下解决此问题。目标-
稳定的应用程序,如果发生这种情况,它可能会在空闲时间中幸免于难:)