programing

java.sql.SQL 예외:oracle.jdbc.driver에 설정된 자동 커밋으로 커밋할 수 없습니다.PhysicalConnection.commit(PhysicalConnection.java:4443)

linuxpc 2023. 6. 30. 22:08
반응형

java.sql.SQL 예외:oracle.jdbc.driver에 설정된 자동 커밋으로 커밋할 수 없습니다.PhysicalConnection.commit(PhysicalConnection.java:4443)

클래스 12.jar에서 ojdbc7.jar로 새로운 jdbc 드라이버로 업그레이드합니다.

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

내 앱은 여전히 클래스 12.jar로 정상적으로 실행됩니다.

오라클에 대해 조사했습니다.

이 예외는 다음 중 하나의 경우에 발생합니다.

  • 자동 커밋 상태가 true로 설정되고 커밋 또는 롤백 방법이 호출되는 경우
  • 자동 커밋의 기본 상태가 변경되지 않고 커밋 또는 롤백 방법이 호출되는 경우
  • COMMIT_ON_ACCEPT_CHANGS 속성 값이 true이고 행 집합에서 acceptChanges 메서드를 호출한 후 커밋 또는 롤백 메서드가 호출되는 경우

하지만 저는 제 정보원에서 실수를 찾을 수 없었습니다.제가 이 오류에 대해 좀 더 설명할 수 있도록 도와주세요.

최신 OJDBC 드라이버는 위치보다 호환성이 높습니다.레거시 코드에 대해 다음 동작을 해제할 수 있습니다.

-Doracle.jdbc.autoCommitSpecCompliant=false

JVM 옵션입니다.

이러한 예외는 Oracle JDBC Driver(ojdbc6.jar) 버전 12 이상이 사용될 때 발생합니다.드라이버 버전 12 이상은 이전 드라이버 버전보다 엄격합니다.

문제를 해결할 수 있으며 다음과 같은 몇 가지 옵션이 있습니다.

  1. jar 파일을 이전 버전으로 변경합니다. (12 이하. 일반적으로 새 서버로 마이그레이션하는 동안 문제가 발생합니다.)
  2. 새 jar 버전(ojdbc6.jar)의 동작을 아래의 JVM 인수 설정으로 재정의합니다.

    -Doracle.jdbc.autoCommitSpecCompliance=false

    IBM WAS 사용자는 다음 링크를 참조하십시오.

  3. Java/SQL에서 자동 커밋 끄기 설정:

    Java:

    conn.setAutoCommit(거짓);

    오라클:

    자동 커밋 해제

근본 원인 -

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에서 일부 코드가 도입된 것을 볼 수 있습니다.한다면autoCommitSpecCompliant그리고.getAutoCommit()둘 다 사실입니다, 우리는 예외를 얻게 될 것입니다.

두 가지 수정 가능 -

  1. autoCommitSpecCompliance false로 설정
    설정할 JVM 매개 변수보다 낮음
    -Doracle.jdbc.autoCommitSpecCompliant=false

  2. 아래 코드를 삽입합니다.connection.commit()

connection.setAutoCommit(false);

우리는 ojbc6.jar를 사용하는 IBM WAS v9입니다. APP 서버, 노드 에이전트 및 DMGR에 적용된 위의 구성은 작동합니다.

-Doracle.jdbc.autoCommitSpecCompliant=false

Dmgr: 배포 관리자 > 프로세스 정의 > Java Virtual Machine 수정 "Generic JVM 인수"

NodeAgent: NodeAgent > nodeagent > 프로세스 정의 > Java Virtual Machine

WebSphere Application Server: Application Servers > WebSphere_Portal > 프로세스 정의 > Java Virtual Machine 수정 "Generic JVM 인수"

코드에서 수행할 수 있는 다른 솔루션이 있습니다.

System.setProperty("oracle.jdbc.autoCommitSpecCompliance", "false");

최대 절전 모드 속성에서 이 옵션을 변경하는 것이 효과가 있었습니다.

hibernate.connection.release_mode=auto

언급URL : https://stackoverflow.com/questions/23953534/java-sql-sqlexception-could-not-commit-with-auto-commit-set-on-at-oracle-jdbc-d

반응형