Java + Apache Commons DBCP 与 MySQL 的连接问题

Java + Apache Commons DBCP connection issue with MySQL

我有一些遗留 Java 代码使用 Apache Commons DBCP 数据库连接池 (v 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 驱动程序升级到最新版本解决了这个问题。