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

时间:2014-05-30 11:29:25

标签: 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

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

我研究过oracle:

以下任何一种情况都会引发此异常:

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

但我无法在我的来源中发现错误。请帮我解释一下这个错误。

5 个答案:

答案 0 :(得分:17)

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

-Doracle.jdbc.autoCommitSpecCompliant=false

这是一个JVM选项。

答案 1 :(得分:6)

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

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

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

    -Doracle.jdbc.autoCommitSpecCompliant =假

    IBM WAS用户,请参阅this link

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

    爪哇:

    conn.setAutoCommit(假);

    甲骨文:

    SET AUTOCOMMIT OFF

答案 2 :(得分:0)

我们是使用ojbc6.jar的IBM WAS v9,上面的配置应用于APP Server,Node agent和DMGR,然后它可以工作。

-Doracle.jdbc.autoCommitSpecCompliant=false

Dmgr: 部署管理器>流程定义> Java虚拟机 修改“通用JVM参数”

NodeAgent: 节点代理> nodeagent>流程定义> Java虚拟机

WebSphere Application Server: 应用程序服务器> WebSphere_Portal>流程定义> Java虚拟机 修改“通用JVM参数”

答案 3 :(得分:0)

根本原因-

ojdbc6中的PhysicalConnector.java

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

ojdbc7中的PhysicalConnector.java

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设置为false
    下面要设置的JVM参数
    -Doracle.jdbc.autoCommitSpecCompliant=false

  2. connection.commit()

  3. 之前插入下面的代码

connection.setAutoCommit(false);

答案 4 :(得分:-1)

在Hibernate属性中更改此功能对我有用

hibernate.connection.release_mode =自动