我有一些遗留的Java代码,它使用Apache Commons DBCP数据库连接池(1.2.2版)连接到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版本的问题。Java代码在较旧的MySQL(5.5及更低版本)中表现不错,在MySQL 5.6+中出现了这个神秘的错误。将JDBC驱动程序升级到最新版本解决了这个问题。