这个问题在 SO 中被问过几次,在其他网站上被问过很多次。但我没有得到任何令人满意的答案。
我的问题:
我有一个 java web 应用程序,它使用简单的JDBC通过Glassfish应用程序服务器 连接到mysql数据库。
我在 glassfish 服务器中使用了具有以下配置的连接池:
初始池大小:25
最大池大小:100
池调整大小:2
空闲超时:300 秒
最大等待时间:60,000 毫秒
该应用程序已经部署了 3 个月,并且运行也很完美。
但是从过去 2 天开始,登录时出现以下错误。
部分堆栈跟踪
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
** BEGIN NESTED EXCEPTION **
com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.io.EOFException
MESSAGE: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
STACKTRACE:
java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1997)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2411)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3256)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1313)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1448)
............
............
my application traces....
是什么突然导致这个错误?我为此浪费了很多时间。
编辑:重新启动服务器后问题甚至仍然存在。根据 DBA,两个重要的 mysql 服务器配置是:
wait_timeout : 1800 秒
connect_timeout : 10 秒
注意:部署在同一服务器上的其他应用程序连接到同一数据库并使用不同的池运行顺利。
EDIT-2:在阅读了很多东西并期待一些积极的结果之后,我对我的连接池进行了这些更改。
最大等待时间: 0(以前是 60 秒)
连接验证:必需
验证方法:表
表名称:演示
最多验证一次: 40 秒
创建重试次数: 1
重试间隔: 5 秒
最大连接使用量: 5
这在应用程序持续运行 3 天时起作用。但我得到了一个非常奇怪和有趣的结果。在监控连接池时,我发现了这些数字:
NumConnAcquired: 44919 计数
NumConnReleased: 44919 计数
NumConnCreated: 9748 计数
NumConnDestroyed: 9793 计数
NumConnFailedValidation: 70 计数
NumConnFree: 161 计数
NumConnUsed: -136 计数
我怎么能NumConnFree
变成161 Maximum Pool Size = 100
?
怎么会NumConnUsed
变成-136,一个负数?>怎么可能?
NumConnDestroyed
NumConnCreated