我在Tomcat下有一个Java应用程序,连接到Postgre和MySQL数据库。 每次我第一次从Java访问数据库(一段时间后),它总是会失败。我检查了Tomcat的日志,发现了这个:
成功发送到服务器的最后一个数据包是85,313,128毫秒之前。是
比服务器配置的'wait_timeout'值更长。你应该考虑其中之一 在您的应用程序中使用之前到期和/或测试连接有效性,增加 服务器为客户端超时配置的值,或使用Connector / J连接 property'autoconnect = true'以避免此问题。
我查了this question 但是并不真正理解解决方案(或者它是否适用于我的情况)或为什么会发生这种情况。
我想问题是Postgre / MySQL数据库空闲时间太长了,但是当我用Java访问数据库时我打开一个连接并在完成时总是关闭它,所以我不明白为什么连接应该保持打开状态这么久。
有人有任何想法吗?
更新
我没有使用C3PO ......我连接:
Datasource d = context.lookup("....");
Connection c = d.getConnection();
与...断开连接:
c.close();
MySQL的上下文如下:
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="200" maxIdle="15" maxWait="-1" name="jdbc/project" password="...." type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/project" username="..."/>
<ResourceLink global="jdbc/project" name="jdbc/project" type="javax.sql.DataSource"/>
答案 0 :(得分:2)
我猜你正在使用连接池来连接MySQL。连接池的原理是它打开一堆连接,并在你要求时给你一个连接。关闭连接时,物理连接未关闭,但连接将返回池,以供其他请求使用。这样可以获得更好的性能,因为您可以无休止地打开和关闭连接:打开连接成本很高。
问题是,如果没有使用太长时间,池中的连接之一就会停留,MySQL会认为让它再打开并关闭它是没用的。 为避免这种情况,您可以