java - JDBC 与 Oracle -executeUpdate 自动更改 AutoCommit 的状态

标签 java oracle jdbc ojdbc autocommit

我们有一个使用连接池的 Java 应用程序。通常在每个函数/进程开始时,我们使用 setAutoCommit(false); 来关闭 AutoCommit。在最后部分,在提交/回滚之后,我们使用 setAutoCommit(true);

将其切换回 ON

我们有时会在一些函数中遇到此异常:

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/

相关文章:

java - 将 JPG 文件加载到 Swing 应用程序中

java - 如何在 Java 中使用 Apache ActiveMQ 实现基于条件的队列

sql - Oracle 9i SQL查询-多次连接同一个表

java - ZeroDateTimeBehavior=convertToNull 在使用 hibernate 的 jdbc url 中不起作用

java - 用于 Oracle 连接的 JDBC 驱动程序

mysql - 使用utf8编码的mysql中的字符串值错误

java - 如果在 Websphere 8.5 中启用了 SSL,则无法查找

java - 带有黑莓路线的谷歌地图

java - Oracle Thin Driver 和 RAC DB 的透明故障转移

sql - SQL 中的复杂求和