java removeabandonedonmaintenance 使用DBCP的Tomcat配置




org.apache.commons.dbcp maven (2)

由于DBCP保持为即将到来的连接请求打开返回的mysql连接,所以它们会被MySQL服务器超时所困

DBCP有许多功能可以帮助(可以从Tomcat 5.5 IIRC开始使用)。

validationQuery="SELECT 1"
testOnBorrow="true"

验证确保连接在返回到执行“借用”方法的Web应用程序之前是有效的。 标志当然,使这个功能。

如果超时(我相信8小时)已经过去并且连接已经死亡,那么测试一个新的连接(如果没有了,就创建它)并提供给webapp。

其他可能的方法:

  1. 在您的资源设置中使用testWhileIdle="true" DBCP,以在检测到有效请求之前检查空闲连接。

  2. 使用'connectionProperties'来加固你的MySQL连接(例如autoReconnect/autoReconnectForPools=true

在经过一段时间(几个小时)之后,我们得到了一个CommunicationsException(来自DBCP)。 错误消息(在异常中)是在这个问题的结尾 - 但我没有看到在任何配置文件中定义的wait_timeout。 (我们应该在哪里看tomcat / conf目录中的某个地方?)。

其次,正如异常所建议的,我们在哪里放置“Connector / J连接属性”autoReconnect = true'“? 这里是tomcat文件conf / context.xml中的资源定义:

<Resource name="jdbc/TomcatResourceName" auth="Container" type="javax.sql.DataSource"
           maxActive="100" maxIdle="30" maxWait="10000"
           removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
           username="xxxx" password="yyyy"
           driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://127.0.0.1:3306/dbname?autoReconnect=true"/>

第三,为什么JVM等待调用executeQuery()抛出异常呢? 如果连接超时,getConnection方法应该抛出异常,不是吗? 这是我正在谈论的源代码部分:

        try {
                conn = getConnection (true);
                stmt = conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                ResultSet.CONCUR_READ_ONLY);
                rset = stmt.executeQuery (bQuery);
                while (rset.next()) {
                     ....

最后,这里是堆栈跟踪的前几行...

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 84,160,724 milliseconds ago.  The last packet sent successfully to the server was 84,160,848 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3291)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1938)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2107)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2642)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2571)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1451)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)

这些是我们中有些人认为“忘记dbcp,可能依赖于IDE配置以及DriverManager.getConnection(...)可能更加可靠的内在魔法”的原因。 对此有何评论? 谢谢你的见解, - MS






apache-commons-dbcp