【问题标题】:Java + Apache Commons DBCP connection issue with MySQLJava + Apache Commons DBCP 与 MySQL 的连接问题
【发布时间】: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


    【解决方案1】:

    我从未调查过 MySQL 版本的问题。 Java 代码在较旧的 MySQL(5.5 和更低版本)上运行良好,并且在 MySQL 5.6+ 中存在这个神秘的错误。将 JDBC 驱动程序升级到最新版本修复了该问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-02
      • 2013-05-28
      • 1970-01-01
      • 2011-06-10
      • 2019-02-10
      • 2014-06-16
      • 2010-10-04
      • 1970-01-01
      相关资源
      最近更新 更多