运行时JDBC程序中的MySQLNonTransientConnectionException

时间:2010-02-19 15:21:16

标签: java mysql jdbc

我在Java中有一个JDBC MySQL连接。我的程序适用于简单的查询执行。

如果我运行相同的程序超过10个小时并执行查询,那么我收到以下MySQL异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
Connection.close() has already been called. Invalid operation in 
this state.
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
  Native Method)
  com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
  No operations allowed after statement closed.
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
  Native Method)

我没有在任何地方使用close()方法。我创建了数据库连接并永远打开它并始终执行查询。我没有明确提到连接超时的地方。我无法确定问题。

以下是我用于数据库连接的代码:

 String driver = PropertyReader.getDriver();
 String url = dbURLPath;
 Class.forName(driver);
 connectToServerDB = DriverManager.getConnection(url);
 connectToServerDB.setAutoCommit(false);

导致该例外的原因是什么?

3 个答案:

答案 0 :(得分:23)

MySQL在超时8小时后终止连接。您可以通过在MySQL中设置wait_timeout变量来修改超时。

然而,通常情况下,应用程序保持连接这么长时间并不是一个好主意。更好的方法是使用池Apache DBCP等池化API设置连接池,并从池中检索连接,而不是直接通过驱动程序。如果连接池由于某种原因(包括超时)而死亡,它也会重新建立池连接。

答案 1 :(得分:6)

您必须在配置文件中进行更改或增加数据库的超时时间。如果数据库闲置超过8小时,则默认关闭。

由于

答案 2 :(得分:2)

我也遇到了同样的问题。这是因为mysql的连接超时,并且通常不是一个很好的做法来扩展mysql中的超时,因为它适用于许多其他应用程序。最好在超时时重新连接数据库(即发生此异常时),或者像@slava建议的那样使用一些开源库进行连接池,如Apache DBCP。 ORM框架默认处理此问题。干杯!!