【发布时间】:2012-12-06 16:38:57
【问题描述】:
这个问题已经在 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 秒
注意: strong> 部署在同一台服务器上的其他应用程序连接到同一个数据库并使用不同的池运行顺利。
EDIT-2 : 在阅读了很多内容并期待一些积极的结果之后,我对我的连接池进行了这些更改。
最大等待时间: 0(之前为 60 秒)
连接验证: 必需
验证方法: 表
表名:演示
最多验证一次: 40 秒
创建重试次数: 1
重试间隔: 5 秒
最大连接使用量: 5
这很有效,因为应用程序连续运行了 3 天。但我得到了一个非常奇怪和有趣的结果。在监控连接池时,我发现了这些数字:
NumConnAcquired: 44919 计数
NumConnReleased: 44919 计数
NumConnCreated: 9748 计数
NumConnDestroyed: 9793 个计数
NumConnFailedValidation: 70 个计数
NumConnFree: 161 个计数
NumConnUsed: -136 个计数
如何 NumConnFree 像我的 Maximum Pool Size = 100 一样变成 161 ?
如何 NumConnUsed 变成 - 136,一个负数?
如何 NumConnDestroyed > NumConnCreated ?
【问题讨论】:
-
尝试在您的应用程序和数据库中使用相同或更小的超时值。例如,如果您的应用程序空闲超时时间高于数据库中的超时时间,您的应用程序将尝试重用已被数据库服务器关闭的连接。
-
它是否有助于增加池调整大小的数量?查看原因here
标签: java mysql glassfish connection pool