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