【发布时间】:2015-03-05 17:53:54
【问题描述】:
我有一些使用 Apache Commons DBCP 数据库连接池 (v 1.2.2) 的遗留 Java 代码来连接到 MySQL 数据库并在用户需要时进行单个查询。
99% 的情况下,查询执行良好,来自 MySQL 数据库的响应是即时且正确的。
最近我注意到一些奇怪的行为:查询无限期挂起。
这是事件跟踪:
Java: get connection from DBCP pool
MySQL: connection is established from <Java machine IP>
# User@Host: <java host>[<java ip>] Id: <...>
# Query_time: 0.000037 Lock_time: 0.000000 Rows_sent: 0
Rows_examined: 0
SET timestamp=1425575615;
SET NAMES utf8;
Java: prepare statement
Java: statement.execute()
tcpdump: I can see packets transferred between Java machine and MySQL
MySQL: no query
Java: hangs (until the MySQL connection timeout kills the connection, then I get an EOF exception - expected)
当它工作时,我可以看到在“SET NAMES utf8”步骤之后在 MySQL 上执行的查询。
我尝试了一堆 DBCP 选项:
- 驱逐设置
- 放弃的连接设置
- 验证查询
DBCP 版本太旧,无法设置validationQueryTimeout 参数。另外,我不知道如何设置 testOnCreate。
有什么想法吗?
解决方法: 我唯一的解决方案是在 MySQL 中设置一个更严格的超时来终止这些挂起的连接,或者重新启动 MySQL 服务器(这会使一切恢复正常)。
谢谢。
【问题讨论】:
标签: mysql sql timeout apache-commons-dbcp