Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 首次访问时出现JDBC异常_Java_Database_Tomcat_Jdbc - Fatal编程技术网

Java 首次访问时出现JDBC异常

Java 首次访问时出现JDBC异常,java,database,tomcat,jdbc,Java,Database,Tomcat,Jdbc,我在Tomcat下有一个Java应用程序,连接到Postgre和MySQL数据库。 每次我第一次从Java访问数据库(一段时间后),它总是失败。我检查了Tomcat的日志,发现: 最后一个成功发送到服务器的数据包是85313128毫秒前的数据包。是 超过服务器配置的“等待超时”值。你应该考虑一下 在应用程序中使用之前,将过期和/或测试连接有效性,增加 服务器为客户端超时或使用连接器/J连接配置了值 属性“autoReconnect=true”以避免此问题 我查过了 但是我并不真正理解解决方案(或

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

最后一个成功发送到服务器的数据包是85313128毫秒前的数据包。是
超过服务器配置的“等待超时”值。你应该考虑一下 在应用程序中使用之前,将过期和/或测试连接有效性,增加 服务器为客户端超时或使用连接器/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

如何连接?您是自己管理连接还是有一个连接池来处理它?如果是后者,如果您自己进行连接管理会发生什么情况?您是否调查过错误消息中的autoReconnect=true提示?您是否使用C3P0之类的sql池?@cdegroot@ZeroPage请查看我的更新。增加等待超时不是一个选项-我不知道要等待多久。我读到MySQL不鼓励使用autoReconnect。所以我认为最好的选择是在使用之前测试连接。你知道我怎么做吗?在context.xml中?请参阅mmmmm。。。但我不认为我在用C3P0,还有别的办法吗?@Sarah:噢,对不起。我看错了你的编辑。你用哪个游泳池?如果是Tomcat连接池,请参阅Tomcat文档:指向的链接