2013-08-11 3 views
0

여기 파일에서 SQL을 읽어 내 코드의 조합을 사용하는 경우 중단 및 수행 일괄 업데이트JDBC가 executeBatch는 MySQL과 BoneCP

public void update(Connection conn, File f) { 
    Statement st = null; 
    Scanner sc = null; 
    try { 
     conn.setAutoCommit(false); 
     st = conn.createStatement(); 

     //Scann the file line by line and addBatch each line... 

     st.executeBatch(); 
     conn.commit(); 

     /************************/ 
     conn.setAutoCommit(true); 
     /************************/ 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (st != null) { st.close();} 
      if (conn != null) { conn.close(); } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

데이터베이스 내가 시도 : HSQLDB(in-process mode), HSQLDB(memory mode), MySQL

DB 풀링은 내가 시도 : No Pooling(DriverManger), DBCP,

다음과 같은 순서로 내 응용 프로그램이 실행 BoneCP :

MySQL BoneCP을 :
1. one batchUpdate() to execute many "create table" and "insert" SQL statement 
2. many executeQuery() to execute many "select" SQL statement 
3. one batchUpdate() to execute many "drop table" statement 

거의 DB 및 DB 풀의 모든 조합 내가 일을 제외하고는 코드에서 강조 conn.setAutoCommit(true);없이 완벽하게 작동합니다. 이 조합이 작동하려면 update() 코드 끝에 conn.setAutoCommit(true);을 넣어야합니다. 다른 방법으로는 프로그램이 3 번째 프로세스 (두 번째 batchUpdate)가 시작될 때 중단됩니다.

내 생각 엔 그것은 write lock 기다립니다 출시하고, 때문에 그것이 응답이었다 유일한 가능한 이유 제 1 batchUpdate() I가 BoneCP를 자동으로 커밋하지 않도록 연결을 설정하고이 발생했기 때문에 잠금이있을 수 있습니다 잡아 write lock을 공개하지 마십시오. 그래서 setAutCommit(true)을 추가했고 효과가있었습니다. 프로그램이 더 이상 중단되지 않습니다.

그럼, 그냥 물어보고 싶습니다. 제 생각에 맞습니까? 또는 다른 이유로 인해서입니까? 다른 조합이 이런 종류의 이상한 행동을 나타내지 않으므로 버그로 간주해야합니까? 감사.

+0

DDL을 별도의 트랜잭션으로 실행하면 어떻게됩니까? –

+0

당신은'create'와'insert'를 분리 할 의향이 있습니까? – Will

+0

DDL은'create'이고'drop'은 별도의 트랜잭션에서 그것들을 사용하려고 시도합니다. –

답변

0

BoneCP에는 버그 (0.8.0-rc3으로 고정)가있어서 자동 실행이 기본적으로 사양대로 true로 설정되지 않았습니다.

config.setDefaultAutoCommit (true)를 설정하여 문제를 해결할 수 있습니다.