2013-03-07 3 views
1

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... 
} 

이 꽤 잘 작동하지만, 약으로 큰 것들에 대한 ... COMMITROLLBACK을 사용할 수 없습니다 단일 트랜잭션에서 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에 복사하여 오류없이 실행할 수 있습니다. 당신이 그 일에 나를 도울 수 있기를 바랍니다, 나는

편집 ... 검색 및 지금 시간 동안 물건을 테스트했습니다

어쩌면 나는이 좋아요, 두 가지 질문하지 않았다 :

  1. Statement.execute()으로 한 번에 여러 문장을 실행할 수 있습니까?
  2. 그렇지 않은 경우 JDBC를 사용하여 여러 구문으로 스크립트를 실행하는 올바른 방법은 무엇입니까 (구문 분석 및 단일 명령문으로 분할하지 않고)?
+0

스크립트에서 직접 또는 간접적으로 커밋을 수행하지 않습니다. –

+0

이 오류는 pgpool에서 발생합니다. 당신은 아마 당신의 pgpool 설정에 의해 지원되지 않는 다중 문장 쿼리를 던지고있을 것이다. –

+0

'Statement.execute()'를 한 번 호출하여 여러 개의 명령문을 실행하는 경우 의도 한대로 JDBC API를 사용하고 있지 않습니다. –

답변

0

솔직히이 스크립트가 SQL 스크립트 인 경우 psql에 대한 쉘 이스케이프를하는 것이 좋습니다. 그것이 이것을 처리하는 가장 좋은 방법입니다. 일반적으로 나는 SQL 코드를 파싱하고 db에 대해 실행하려고하는 사람들로부터 너무나 많은 불쾌한 결과를 얻었습니다. 이 방법은 광기 거짓말.

"작은 스크립트"라고 말하면 데이터베이스 설정 (또는 업그레이드,하지만 쿼리가 없으므로 가능성이 적습니다)과 같은 일을한다고 결론 내릴 수 있습니다. 쉘 탈출구를 통해 psql을 사용하고 뒤돌아 보지 마십시오. 정말 그게 최선의 방법입니다.

스크립트에 명시적인 BEGIN 및 COMMIT를 추가해 볼 수 있다면 좋겠다고 생각합니다.

나는 암묵적으로 트랜잭션을 커밋하고있는 것 같습니다. 자동 커밋을 올바르게 설정하지 않았습니다. 코드에는 명백한 문제가 없습니다. 오래되었거나 버그가있는 JDBC 드라이버가있을 수 있습니까? 그렇지 않다면 PostgreSQL JDBC 드라이버 프로젝트에 버그 보고서를 제출하는 것이 좋습니다.

관련 문제