java.sql.SQLException:无法在oracle.jdbc.driver.PhysicalConnection.com上设置自动提交(PhysicalConnection.java:4443)

sca*_*ork 11 java oracle jdbc

我只是从classes12.jar升级到新的jdbc驱动程序到ojdbc7.jar

当我使用ojdbc7.jar运行时,我的应用程序抛出异常:

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
Run Code Online (Sandbox Code Playgroud)

我的应用程序仍然使用classes12.jar正常运行.

我研究过oracle:

针对以下任何一种情况引发此异常:

  • 当自动提交状态设置为true并调用commit或rollback方法时
  • 如果未更改自动提交的默认状态,则调用commit或rollback方法
  • 当COMMIT_ON_ACCEPT_CHANGES属性的值为true并且在对行集调用acceptChanges方法之后调用commit或rollback方法时

但我在我的来源中找不到错误.请帮我详细解释一下这个错误.

Ola*_*son 18

最新的OJDBC驱动程序比它们更符合要求.您可以为遗留代码关闭此行为:

-Doracle.jdbc.autoCommitSpecCompliant=false
Run Code Online (Sandbox Code Playgroud)

这是一个JVM选项.


Rus*_*ini 6

当使用Oracle JDBC驱动程序(ojdbc6.jar)版本12或更高版本时,会发生此类异常.驱动程序的12及更高版本比早期的驱动程序版本更严格.

你可以解决问题,你有几个选择:

  1. 将jar文件更改为旧版本.(12以下;迁移到新服务器时通常会出现问题)
  2. 使用以下JVM参数设置覆盖新jar版本(ojdbc6.jar)的行为.

    -Doracle.jdbc.autoCommitSpecCompliant = FALSE

    IBM WAS用户,请参考以下链接:

  3. 在Java/SQL中设置自动提交:

    Java的:

    conn.setAutoCommit(假);

    甲骨文:

    设置AUTOCOMMIT OFF


vin*_*inS 5

根本原因 -

\n

ojdbc6 中的 PhysicalConnector.java

\n
public void commit(int paramInt) throws SQLException {\n    disallowGlobalTxnMode(114);\n    if (this.lifecycle != 1) {\n        SQLException sQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 8);\n        sQLException.fillInStackTrace();\n        throw sQLException;\n    }\n    .\n    .\n
Run Code Online (Sandbox Code Playgroud)\n

ojdbc7 中的 PhysicalConnector.java

\n
public void commit(int paramInt) throws SQLException {\n    disallowGlobalTxnMode(114);\n    \xe2\x80\x8bif (this.autoCommitSpecCompliant && getAutoCommit()) {\n        throw (SQLException)DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 273).fillInStackTrace();\n    }\n    if (this.lifecycle != 1) {\n        SQLException sQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 8);\n        sQLException.fillInStackTrace();\n        throw sQLException;\n    \xe2\x80\x8b}\n    .\n    .\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以看到,在ojdbc7中,已经引入了一段代码。如果autoCommitSpecCompliant两者都getAutoCommit()为真,我们将得到例外。

\n

两个可用的修复方法 -

\n
    \n
  1. 将 autoCommitSpecCompliant 设置为 false
    \n下面要设置的 JVM 参数
    \n-Doracle.jdbc.autoCommitSpecCompliant=false

    \n
  2. \n
  3. 之前插入下面的代码connection.commit()

    \n
  4. \n
\n

connection.setAutoCommit(false);

\n