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



我有一些遗留的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驱动程序升级到最新版本解决了这个问题。

相关内容

  • 没有找到相关文章

最新更新