Java.sql.SQLException: не удалось зафиксировать с помощью автоматической фиксации на oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:4443)

Я просто обновляю до нового драйвера jdbc от classes12.jar до 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.

Я исследовал оракул:

Это исключение возникает для любого из следующих случаев:

  • Если для параметра автоматической фиксации установлено значение true, а метод фиксации или отката называется
  • Если статус автоматической фиксации по умолчанию не изменен, а метод фиксации или отката называется
  • Когда значение свойства COMMIT_ON_ACCEPT_CHANGES истинно и вызывается метод commit или rollback после вызова метода acceptChanges в наборе строк

Но я не мог найти ошибку в моем источнике. Пожалуйста, помогите мне объяснить больше об этой ошибке.

Ответ 1

Новые драйверы OJDBC более совместимы, а затем они где. Вы можете отключить это поведение для устаревшего кода:

-Doracle.jdbc.autoCommitSpecCompliant=false

Это опция JVM.

Ответ 2

Этот вид исключений возникает, когда будет использоваться драйвер JDBC Oracle (ojdbc6.jar) версии 12 или выше. Версия 12 и выше драйвера более строго, чем предыдущие версии драйверов.

Вы можете решить проблему, у вас есть несколько вариантов:

  • Измените файл jar на старую версию. (Ниже 12, обычно проблема возникает при переносе на новый сервер)
  • Переопределить поведение новой версии jar (ojdbc6.jar) с настройкой ниже аргументов JVM.

    -Doracle.jdbc.autoCommitSpecCompliant = ложь

    Пользователи IBM WAS, обратитесь эта ссылка:

  • Установите автоматическое завершение работы в Java/SQL:

    Java:

    conn.setAutoCommit(ложь);

    Oracle:

    НАСТРОЙКА АВТОКОММУНИЗАЦИИ

Ответ 3

Мы являемся IBM WAS v9 с использованием ojbc6.jar. Приведенная выше конфигурация применяется к серверу APP, агенту узла и DMGR, затем она работает.

-Doracle.jdbc.autoCommitSpecCompliant=false

Dmgr: Диспетчер развертывания> Определение процесса> Виртуальная машина Java Изменить "Универсальные аргументы JVM"

NodeAgent: агенты Node> агент узла> определение процесса> виртуальная машина Java

WebSphere Application Server: серверы приложений> WebSphere_Portal> определение процесса> виртуальная машина Java изменяет "общие аргументы JVM"

Ответ 4

Основная причина -

PhysicalConnector.java в ojdbc6

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 в ojdbc7

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 был введен некоторый фрагмент кода. Если autoCommitSpecCompliant и getAutoCommit() оба истинны, мы получим исключение.

Доступно два исправления -

  1. установить false autoCommitSpecCompliant
    Параметр ниже JVM должен быть установлен
    -Doracle.jdbc.autoCommitSpecCompliant=false

  2. вставьте ниже кусок кода перед connection.commit()

connection.setAutoCommit(false);

Ответ 5

Изменение этого в свойствах Hibernate работало для меня

hibernate.connection.release_mode = авто