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 이상은 이전 드라이버 버전보다 엄격합니다.
문제를 해결할 수 있으며 다음과 같은 몇 가지 옵션이 있습니다.
- jar 파일을 이전 버전으로 변경합니다. (12 이하. 일반적으로 새 서버로 마이그레이션하는 동안 문제가 발생합니다.)
새 jar 버전(ojdbc6.jar)의 동작을 아래의 JVM 인수 설정으로 재정의합니다.
-Doracle.jdbc.autoCommitSpecCompliance=false
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()
둘 다 사실입니다, 우리는 예외를 얻게 될 것입니다.
두 가지 수정 가능 -
autoCommitSpecCompliance false로 설정
설정할 JVM 매개 변수보다 낮음
-Doracle.jdbc.autoCommitSpecCompliant=false
아래 코드를 삽입합니다.
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
'programing' 카테고리의 다른 글
Docker에서 Wordpress로 게시물을 저장할 수 없습니다. (0) | 2023.06.30 |
---|---|
여러 열을 기준으로 그룹화 (0) | 2023.06.30 |
MariaDB ROW_NUMBER(주문 번호 포함)가 올바르게 주문되지 않음 (0) | 2023.06.30 |
IIS에서 스레드를 사용하여 장시간 실행 작업을 수행할 수 있습니까? (0) | 2023.06.30 |
excel: xml 데이터를 저장하거나 내보낼 수 없습니다.이 워크북의 xml 맵은 내보낼 수 없습니다. (0) | 2023.06.30 |