我在这里检查了有关此主题的相关问题,并在 Google 上搜索了一段时间。似乎我仍然不理解 Tomcat 的 DBCP 配置或机制中的某些东西。
我在以下位置配置了 Tomcat 6、DBCP 资源server.xml
:
<Resource name="jdbc/myDB" auth="Container" description="Database connection"
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
,它是默认的28800
。
总之,我尝试了几个选项,但似乎问题是 mysql 连接达到了 28800 秒的空闲时间并且服务器关闭了它们。我认为该池应该以某种方式使用 and 来处理这种情况validationQuery
,testOnBorrow
但似乎我错了。
如果我autoReconnect
在url
空闲期后使用我的第一次查询尝试导致“ ...CommunicationsException: The last packet successfully received from the server was 157,493,261 milliseconds ago.
”但在此之后它工作正常。
如果我使用或不使用它 - 在空闲期(8 小时)之后,我每次都得到“ autoReconnectForPools
” 。url
.MySQLNonTransientConnectionException: No operations allowed after connection closed
在这两种情况下,当应用程序加载时,事情都会顺利进行。因此,我得出结论,连接是从 mysql 一侧关闭的。
帮助,我错过了什么?我想在不更改 Mysql 中的 wait_timeout 的情况下解决这个问题。目标 - 稳定的应用程序,如果发生空闲时间,它可能会存活 :)