java - JDBC 第一次访问异常

标签 java database tomcat jdbc

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

The last packet sent successfully to the server was 85,313,128 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.

我检查了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"/>

最佳答案

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

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

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

关于java - JDBC 第一次访问异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6642705/

相关文章:

java - Spring MVC 和安全性 - 授权期间 protected 资源的识别

mysql - 何时以及为何应该为只接受来自预先确定列表的值的属性创建表?

php - 如何使用我的 Tomcat 配置 PHP

java - 使用 valueOf 枚举的字符串与 java.lang.IllegalArgumentException 崩溃

java - Criteria.list() 以 BatchUpdateException : Data truncation 结尾

php - 在一个有两个外键的表中插入数据(php)

java - 将结果查询转换为字符串

hibernate - 关于 JPA persistence.xml

Java servlet 在 Tomcat 中返回空白页

Java项目架构