第一次访问JDBC异常

时间:2011-07-10 17:39:53

标签: java database tomcat jdbc

我在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"/>

1 个答案:

答案 0 :(得分:2)

我猜你正在使用连接池来连接MySQL。连接池的原理是它打开一堆连接,并在你要求时给你一个连接。关闭连接时,物理连接未关闭,但连接将返回池,以供其他请求使用。这样可以获得更好的性能,因为您可以无休止地打开和关闭连接:打开连接成本很高。

问题是,如果没有使用太长时间,池中的连接之一就会停留,MySQL会认为让它再打开并关闭它是没用的。 为避免这种情况,您可以

  • 配置连接池以在连接之前测试连接
  • 或增加MySQL服务器上的wait_timeout,如错误消息
  • 中所示
  • 或使用连接属性autoReconnect = true,如错误消息中所示。