首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:4443)上的自动提交设置为java.sql.SQLException:无法提交

oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:4443)上的自动提交设置为java.sql.SQLException:无法提交
EN

Stack Overflow用户
提问于 2014-05-30 11:29:25
回答 6查看 85.1K关注 0票数 22

我刚刚升级到新的jdbc驱动程序,从driver 12.jar升级到ojdbc7.jar

我的应用程序在使用ojdbc7.jar运行时抛出了一个异常:

代码语言:javascript
运行
复制
java.sql.SQLException: Could not commit with auto-commit set on
    at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:4443)
    at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:4490)
    at oracle.jdbc.driver.T4CConnection.doSetAutoCommit(T4CConnection.java:943)
    at oracle.jdbc.driver.PhysicalConnection.setAutoCommit(PhysicalConnection.java:4

我的应用程序仍然在12.jar类中正常运行。

我研究甲骨文:

对于下列任何一种情况,都会引发此例外:

  • 当自动提交状态设置为true并提交或回滚方法时,调用
  • 当未更改自动提交的默认状态并调用提交或回滚方法时,
  • 当COMMIT_ON_ACCEPT_CHANGES属性值为true,并在调用行集上的acceptChanges方法后调用提交或回滚方法

但我在消息来源中找不到错误。请帮我解释一下这个错误。

EN

回答 6

Stack Overflow用户

发布于 2014-11-26 13:45:42

最新的OJDBC驱动程序比其他地方的驱动程序更兼容。对于遗留代码,可以关闭此行为:

代码语言:javascript
运行
复制
-Doracle.jdbc.autoCommitSpecCompliant=false

这是JVM选项。

票数 23
EN

Stack Overflow用户

发布于 2017-01-21 09:04:39

当使用Oracle驱动程序(ojdbc6.jar)版本12或更高版本时,会发生这种异常。版本12和更高版本的驱动程序比以前的驱动程序版本更严格。

你可以解决这个问题,你没有什么选择:

  1. 将jar文件更改为旧版本。(低于12;通常在迁移到新服务器时出现问题)
  2. 通过在JVM参数下面设置新jar版本(ojdbc6.jar)的行为。 -Doracle.jdbc.autoCommitSpecCompliant=false IBM是用户,请参考此链接
  3. 在Java/SQL中设置自动提交: 爪哇: Conn.setAutoCommit(假); 甲骨文: 自动关闭
票数 11
EN

Stack Overflow用户

发布于 2019-08-27 08:42:00

根本原因-

PhysicalConnector.java in ojdbc6

代码语言:javascript
运行
复制
public void commit(int paramInt) throws SQLException {
    disallowGlobalTxnMode(114);
    if (this.lifecycle != 1) {
        SQLException sQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 8);
        sQLException.fillInStackTrace();
        throw sQLException;
    }
    .
    .

PhysicalConnector.java in ojdbc7

代码语言:javascript
运行
复制
public void commit(int paramInt) throws SQLException {
    disallowGlobalTxnMode(114);
    ​if (this.autoCommitSpecCompliant && getAutoCommit()) {
        throw (SQLException)DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 273).fillInStackTrace();
    }
    if (this.lifecycle != 1) {
        SQLException sQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 8);
        sQLException.fillInStackTrace();
        throw sQLException;
    ​}
    .
    .

我们可以看到,在ojdbc7中,已经引入了一些代码。如果autoCommitSpecCompliantgetAutoCommit()都是真的话,我们就会异常。

有两种解决办法-

  1. 设置autoCommitSpecCompliant假 下面将设置JVM参数 -Doracle.jdbc.autoCommitSpecCompliant=false
  2. 在下面的代码段中插入connection.commit()前的

connection.setAutoCommit(false);

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23953534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档