Tomcat 7.0.47 MySQL Connector / J 5.1.20
我正在测试HA数据库设置,其中DNS名称可以访问mysql数据库(AWS中的RDS)。故障转移后,数据库将获得新的IP。
我有一个测试Web应用程序,在context.xml中定义了以下数据库连接:
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
maxActive="3" maxIdle="2" maxWait="1000" name="jdbc/db"
password=“xxx” type="javax.sql.DataSource"
url="jdbc:mysql://xxx:3306/xxx?autoReconnect=true" username="root"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
removeAbandoned="true" logAbandoned="true" removeAbandonedTimeout="60"
/>
正如您所看到的,定义了非常少量的连接,因此可以更容易地再现此问题。我有一个每秒都进行一次AJAX REST调用的Web客户端,这个调用只是在数据库中进行单个选择和单个插入。 Web框架是使用Spring JDBC的Spring MVC。
我启动了足够多的客户端以最大化并发数据库使用率,然后我对数据库进行了故障转移。数据库恢复,DNS故障转移到新IP。我在Tomcat中看到的行为是连接永远不会被释放或放弃。
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/test] threw exception [Request processing failed; nested exception
is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection;
nested exception is org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-bio-8080-exec-11] Timeout: Pool empty. Unable to fetch a connection in 1 seconds, none available[size:3; busy:2; idle:0; lastwait:1000].] with root cause
org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-bio-8080-exec-11] Timeout: Pool empty. Unable to fetch a connection in 1 seconds, none available[size:3; busy:2; idle:0; lastwait:1000].
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:674)
......应用程序永远不会恢复。我正在寻找一种方法让Tomcat无需重启Tomcat即可恢复这些连接。当然必须要让Tomcat认识到这些连接已经死亡并将它们从池中弹出?我认为这是removeAbandoned =“true”的意图,但它似乎没有帮助。
有什么想法吗?
---更新---
在调试器中,我发现清理废弃连接的PoolCleaner线程挂起在JDBC4Connection(ConnectionImpl).close():1641上。 PoolCleaner停止了,连接没有得到清理。不确定为什么close()超时...
答案 0 :(得分:0)
你可能有JDBC连接泄漏问题,客户端没有再见,服务器端认为连接忙,因此永远不会回收到池的繁忙连接。