我有一个 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);
是什么导致了这个异常?
最佳答案
MySQL 在 8 小时超时后终止连接。您可以通过设置 wait_timeout 来修改超时。 MySQL 中的变量。
然而,一般来说,应用程序保持连接这么长时间并不是一个好主意。更好的方法是使用池化 API 设置连接池,例如 Apache DBCP。并从池中检索连接,而不是直接通过驱动程序。如果连接池由于某种原因(包括超时)而终止,连接池还将负责重新建立池连接。
关于java - 运行时 JDBC 程序中的 MySQLNonTransientConnectionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2297356/