【问题标题】:JDBC exception on the first time access首次访问 JDBC 异常
【发布时间】:2011-10-02 07:56:43
【问题描述】:

我在 Tomcat 下有一个 Java 应用程序,连接到 Postgre 和 MySQL 数据库。 每次我从 Java 访问数据库时(一段时间后),它总是失败。我检查了 Tomcat 的日志,发现:

最后一个成功发送到服务器的数据包是在 85,313,128 毫秒前。是
长于服务器配置的“wait_timeout”值。你应该考虑 在您的应用程序中使用之前过期和/或测试连接有效性,增加 服务器为客户端超时配置值,或使用连接器/J 连接 属性 'autoReconnect=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"/>

【问题讨论】:

  • 你是如何连接的?你自己管理连接还是有一个连接池来处理它?如果是后者,如果您自己掌握连接管理会发生什么?
  • 您是否调查过错误消息中的 autoReconnect=true 提示?你使用任何像 C3P0 这样的 sql 池吗?
  • @cdegroot @ZeroPage 请看我的更新

标签: java database tomcat jdbc


【解决方案1】:

我猜您正在使用连接池来连接到 MySQL。连接池的原理是打开一堆连接,当你请求的时候给你一个。当您关闭连接时,物理连接并没有关闭,而是连接返回到池中以便被另一个请求使用。这可以带来更好的性能,因为您可以避免无休止地打开和关闭连接:打开连接的成本很高。

问题是其中一个连接停留在池中没有被使用太多时间,MySQL认为让它不再打开没有用,并关闭它。 为避免这种情况,您可以

  • 配置您的连接池以测试连接,然后再将其提供给您
  • 或者按照错误信息中的指示增加 MySQL 服务器上的 wait_timeout
  • 或使用错误消息中指示的连接属性 autoReconnect=true。

【讨论】:

  • 谢谢。增加 wait_timeout 不是一种选择——我不知道提前多久。我读过 MySQL 不鼓励使用 autoReconnect。所以我想最好的选择是在使用之前测试连接。你知道我怎么能做到吗?在 context.xml 中?
  • mmmmm...但是我不认为我在使用C3P0,还有其他方法吗?
  • @Sarah:哎呀,对不起。我误读了你的编辑。你用哪个游泳池?如果是 Tomcat 连接池,请参阅 tomcat 文档:tomcat.apache.org/tomcat-7.0-doc/… 链接到 commons.apache.org/dbcp/configuration.html
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多