PostgreSQL 용 JDBC를 사용하여 실행하려고하는 꽤 긴 트랜잭션이 있습니다. 나는 자바 코드에 내 원하는 동작을 구현하기 위해 노력하고있어 그래서 JDBC에서 나는PostgreSQL 트랜잭션이 실패합니다 : "진행중인 트랜잭션이 없습니다"
작은 문의 경우try {
con = DriverManager.getConnection(url, user, password);
con.setAutoCommit(false);
Statement st = con.createStatement();
st.execute(myHugeTransaction);
con.commit();
} catch (SQLException ex) {
try {
con.rollback();
} catch (SQLException ex1) {
// log...
}
// log...
}
이 꽤 잘 작동하지만, 약으로 큰 것들에 대한 ... COMMIT
및 ROLLBACK
을 사용할 수 없습니다 단일 트랜잭션에서 10K 문,이, 내가 st.getWarnings();
와 SQL 경고를 잡으면 재미있는 것은, 나는 데이터베이스가 실제로 내가 보낸 전체 스크립트를 처리하고 있음을 알 수있다
org.postgresql.util.PSQLException: ERROR: kind mismatch among backends. Possible last query was: "COMMIT" kind details are: 0[C] 1[N: there is no transaction in progress]
와 con.commit
라인에 실패 커밋에 관한 한 모든 것이 실패합니다.
btw, 거래가 완전히 좋습니다. 필자는 파일의 정확한 복사본을 파일에 기록하고 pgAdmin에 복사하여 오류없이 실행할 수 있습니다. 당신이 그 일에 나를 도울 수 있기를 바랍니다, 나는
편집 ... 검색 및 지금 시간 동안 물건을 테스트했습니다
어쩌면 나는이 좋아요, 두 가지 질문하지 않았다 :
을Statement.execute()
으로 한 번에 여러 문장을 실행할 수 있습니까?- 그렇지 않은 경우 JDBC를 사용하여 여러 구문으로 스크립트를 실행하는 올바른 방법은 무엇입니까 (구문 분석 및 단일 명령문으로 분할하지 않고)?
스크립트에서 직접 또는 간접적으로 커밋을 수행하지 않습니다. –
이 오류는 pgpool에서 발생합니다. 당신은 아마 당신의 pgpool 설정에 의해 지원되지 않는 다중 문장 쿼리를 던지고있을 것이다. –
'Statement.execute()'를 한 번 호출하여 여러 개의 명령문을 실행하는 경우 의도 한대로 JDBC API를 사용하고 있지 않습니다. –