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