Java 首次访问时出现JDBC异常
我在Tomcat下有一个Java应用程序,连接到Postgre和MySQL数据库。 每次我第一次从Java访问数据库(一段时间后),它总是失败。我检查了Tomcat的日志,发现: 最后一个成功发送到服务器的数据包是85313128毫秒前的数据包。是Java 首次访问时出现JDBC异常,java,database,tomcat,jdbc,Java,Database,Tomcat,Jdbc,我在Tomcat下有一个Java应用程序,连接到Postgre和MySQL数据库。 每次我第一次从Java访问数据库(一段时间后),它总是失败。我检查了Tomcat的日志,发现: 最后一个成功发送到服务器的数据包是85313128毫秒前的数据包。是 超过服务器配置的“等待超时”值。你应该考虑一下 在应用程序中使用之前,将过期和/或测试连接有效性,增加 服务器为客户端超时或使用连接器/J连接配置了值 属性“autoReconnect=true”以避免此问题 我查过了 但是我并不真正理解解决方案(或
超过服务器配置的“等待超时”值。你应该考虑一下 在应用程序中使用之前,将过期和/或测试连接有效性,增加 服务器为客户端超时或使用连接器/J连接配置了值 属性“autoReconnect=true”以避免此问题 我查过了 但是我并不真正理解解决方案(或者如果它适用于我的案例)或者为什么会发生这种情况 我想问题是Postgre/MySQL数据库闲置的时间太长了,但是当我用Java访问数据库时,我打开了一个连接,并且总是在完成时关闭它,所以我不明白为什么连接应该保持开放这么长时间 有人有什么想法吗 更新: 我没有使用C3PO。。。我联系:
Datasource d = context.lookup("....");
Connection c = d.getConnection();
c.close();
并与以下设备断开连接:
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服务器上的等待超时,如错误消息中所示
- 或者使用错误消息中指示的连接属性autoReconnect=true