2014-06-17 2 views
0

다음 코드는 3 개의 배치 삽입을 시도합니다. 두 번째 배치의 두 번째 구문은 의도적으로 잘못되었습니다 (INSERTD). 이 프로그램을 실행하면 첫 번째와 세 번째 배치가 실행되고 데이터가 데이터베이스에 삽입되어야합니다.JDBC 복수 배치 실행 문제

하지만 데이터를 삽입하지 않습니다. 누군가가 이유를 말할 수 있습니까? 그리고 다른 일괄 처리에 관계없이 올바른 일괄 처리가 실행되도록 수정하는 방법은 무엇입니까? 출력

OP1

public class Test { 

    public static void main(String[] args) throws SQLException, ClassNotFoundException { 

     ArrayList<String> finalsql1 = new ArrayList<String>(); 
     finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')"); 
     finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN2','WRL')"); 

     ArrayList<String> finalsql2 = new ArrayList<String>(); 
     finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')"); 
     finalsql1.add("INSERTD INTO M_TEST VALUES('PUJAN2','WRL')"); 

     ArrayList<String> finalsql3 = new ArrayList<String>(); 
     finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')"); 
     finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN2','WRL')"); 

     System.out.println("OP1=" + insertEntity(finalsql1)); 
     System.out.println("OP2=" + insertEntity(finalsql2)); 
     System.out.println("OP3=" + insertEntity(finalsql3)); 

    } 

public static boolean insertEntity(ArrayList<String> finalsql) throws SQLException { 
     Connection conn = null; 
     Statement ps = null; 
     boolean result = false; 

     try { 
      conn = getConnection(); 
      conn.setAutoCommit(false); 
      ps = conn.createStatement(); 
      for (String sql : finalsql) { 
       System.out.println("sql > " + sql); 
       ps.addBatch(sql); 
      } 
      int[] count = ps.executeBatch(); 

      result = true; 
     } catch (Exception e) { 
      conn.rollback(); 
      e.printStackTrace(); 
      result = false; 
     } finally { 
      conn.commit(); 
      ps.close(); 
      conn.close(); 
     } 
     return result; 
    } 
} 

= 사실

OP2 = 거짓

OP3 = 사실

+0

. 그래서 첫 번째 배치의 트랜잭션은 성공해야합니까? –

+0

그 테이블'M_TEST'은 비어 있습니까? – Andremoniy

+0

예 M_TEST가 비어 있습니다. –

답변

1

이 데이터와 삽입의 단 하나의 배치이며,이 포함 INSERTD 따라서 롤백 중입니다. 왜? 당신은 아직 여기 finalsql1에 항목을 추가하는

ArrayList<String> finalsql2 = new ArrayList<String>(); 
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')"); 
finalsql1.add("INSERTD INTO M_TEST VALUES('PUJAN2','WRL')"); 

, 그래서 finalsql2finalsql2이 비어 : 여기 왜.

finalsql1은 고의적 인 실수를 포함하여 모든 항목을 포함하므로 전체 전체가 롤백됩니다.