运行时JDBC程序中的MySQLNonTransientConnectionException

运行时JDBC程序中的MySQLNonTransientConnectionException

问题描述:

我在Java中有一个JDBC MySQL连接。我的程序工作正常,简单的查询执行。运行时JDBC程序中的MySQLNonTransientConnectionException

如果我在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); 

是什么原因导致的异常?

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

谢谢

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

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

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