2010-07-27 3 views
1

나는 PreparedStatement로를 만든 내가 추신을 실행할 때 이제 bactch배치 - 롤백 작업

PreparedStatement ps = conn.PreparedStatement("INSERT into table (a, b) values (?, ?)"; 

ps.setInt(1, 1); 
ps.setInt(2, 2); 

ps.addBatch 

ps.setInt(1, 4); 
ps.setInt(2, 5); 

ps.addBatch 

데이터의 몇 가지를 추가했습니다. 나는 결과를 얻었고 이제는 ps가 실패했다는 것을 알려주고, 배치 모드가 아니라 하나씩 레코드를 삽입하려고한다.

어떻게 준비된 문을 추출합니까, 크기를 얻을 수 있지만 레코드를 가져 오는 방법을 모르십니까?

답변

1

첫 번째 위치에 레코드를 하나씩 삽입 할 수 없습니까? DBMS가 트랜잭션을 지원하는 경우 (대부분 현대 트랜잭션이 트랜잭션을 지원하는 경우), 모든 삽입을 하나의 원자 트랜잭션으로 묶을 수 있으며, 데이터베이스의 다른 사용자에게는 한 번에 모두 추가 한 것처럼 보입니다 (아래의 의사 코드 참조).

connection.setAutoCommit(false); 
try{ 
    insert(1,2); 
} 
catch(Exception e){ 
    System.out.println("1, 2 didn't work"); 
} 
try{ 
    insert(4,5); 
} 
catch(Exception e){ 
    System.out.println("4, 5 didn't work"); 
} 
connection.commit(); 
+0

실제로 일괄 업데이트가 실패하면 레코드를 하나씩 삽입하고 해당 레코드에 대한 예외를 캡처해야한다는 요구 사항이 있습니다. – Vivek

+1

당신은 여전히 ​​이것으로 할 수 있습니다. e를 변수에 할당하고 메시지를 인쇄하는 대신 그것을 보관하십시오 (모든 것을 순차적으로 작성하는 것이 아니라 루프에서 수행하십시오). 예외 상황을 막으려 고한다면, 루프 내에서 예외를 잡아 두지 마십시오. 배치 업데이트를 먼저 시도해보고 싶지 않으신가요? 개별 삽입을 수행하는 코드를 작성해야합니다. 왜 처음부터 사용하지 않으시겠습니까? – Scott