2010-08-13 5 views
0

sqlite에 대한 연결을 포함하여 작은 프로젝트를하고 있습니다. 필자는 일대 다 관계로 두 테이블에 씁니다.연결을 닫지 않으면 준비된 문장의 마지막 일괄 처리가 작성되지 않습니다.

연결을 명시 적으로 닫지 않으면 두 번째 테이블의 마지막 배치가 기록되지 않습니다. 데이터베이스가 자동 커밋 모드 (예 : connection.commit() 오류 발생)로 이상하다고 생각합니다.

필자는 write 메소드를 꽤 많이 호출 할 것이므로 연결을 유지하고 싶습니다.

강제로 디스크에 쓰기 작업을 수행 할 수있는 commit() 옆에 뭔가가 있습니까?

최소 코드 예제에 가깝습니다. conn.close() 주석 처리를 제거하면 원하는대로 작동합니다.

Class.forName("org.sqlite.JDBC"); 
Connection conn = DriverManager.getConnection("jdbc:sqlite:result"); 
Statement stat = conn.createStatement(); 

stat.executeUpdate("create table if not exists " + 
      "a (a1, aID INTEGER PRIMARY KEY ASC)"); 

stat.executeUpdate("create table if not exists " + 
      "b (aID, b1, attributePathID INTEGER PRIMARY KEY ASC)"); 

PreparedStatement pa = conn.prepareStatement(
      "insert into a (a1) values (?);"); 

PreparedStatement pb = conn.prepareStatement(
      "insert into b (aID,b1) values (?,?);"); 

int[] aSet = new int[] {10,20,30}; 
int[] bSet = new int[] {1,2}; 


for(int ai : aSet){ 
    pa.setInt(1,ai); 
    pa.execute(); 

    ResultSet rs = pa.getGeneratedKeys(); 
    rs.next(); 
    long aID = rs.getLong(1); 

    for(int bi : bSet){ 
     pb.setLong(1,aID); 
     pb.setInt(2,bi); 
     pb.execute(); 
     } 
    } 
    //conn.close(); 

답변

1

는 JDBC와 협력 등 sqllite,하지만이 작업을해야하지 않았 :

또한
conn.setAutoCommit(false); 
for(int bi : bSet){ 
    pb.setLong(1,aID); 
    pb.setInt(2,bi); 
    pb.executeUpdate(); 
    } 
conn.commit(); 
conn.setAutoCommit(true); 

는 당신과 같은 좋은 예제가 http://www.zentus.com/sqlitejdbc/를보십시오.

+0

conn.commit();에 SQLException "SQL logic error or missing database"가 throw됩니다. 열. 하지만 링크의 예제가 효과적이었습니다. ResultSet이 여전히 열려 있기 때문에 예외가 발생했습니다. 그래서 당신의 픽스를 추가하고 rs.close()를 사용했다. –

+0

기꺼이 도와 드리겠습니다. – Tchami

관련 문제