我们有一个使用连接池的 Java 应用程序。通常在每个函数/进程开始时,我们使用 setAutoCommit(false); 来关闭 AutoCommit。在最后部分,在提交/回滚之后,我们使用 setAutoCommit(true);
我们有时会在一些函数中遇到此异常:
java.sql.SQLException: Could not commit with auto-commit set on
经过调查,我们发现在 executeUpdate
后,AutoCommit 状态随机从 OFF/false 更改为 ON/true,没有任何明显的原因。
status = connection.getAutoCommit(); // stores false
statement.executeUpdate(sQuery.toString());
status = connection.getAutoCommit(); // stores true
正如我所说,这并不总是会发生。这些行之间没有其他可能更改状态的函数调用。
作为解决方法,如果 AutoCommit 状态发生变化,我们会在执行更新后恢复它。但我们需要了解更多,因为在应用程序中使用了几十次executeUpdate。
有人遇到过类似的问题吗?除了上述之外还有什么解决办法吗?
我们将 Java 1.8 与 Oracle 11 和 ojdbc8-19.3.0.0.jar 结合使用
最佳答案
一种更合理的解释是,连接对象被多个线程同时使用,而另一个线程更改了两次 getAutoCommit() 调用之间的自动提交模式。出于各种原因,强烈建议不要同时跨线程共享 JDBC 连接,其中之一就是您所看到的行为,但您也可能最终导致数据库 session 死锁。
JDBC 规范规定,在启用了自动提交模式的连接上调用 commit() 应该引发异常。但有一个 JDBC 属性可用于放松此行为:将“oracle.jdbc.autoCommitSpecCompliant”设置为“false”。请参阅 Javadoc here .
关于java - JDBC 与 Oracle -executeUpdate 自动更改 AutoCommit 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75687184/