응용프로그램이 표시된 연결에서 실행하기 위해 요청하는 모든 후속 SQL문은 메모리의 큐에 대기되어 있습니다. pureQuery는 각 명령문이 아직 실행되지 않은 경우에도 성공적으로 실행되었음을 표시하는 더미 결과를 응용프로그램에 리턴합니다. 사용자가 pureQuery에 일괄처리 갱신을 종료 중임을 표시하는 메소드를 호출합니다. 이때, pureQuery는 큐에 대기된 모든 SQL문을 실행합니다.
SQL문에 물음표("?")를 사용하여 메소드가 해당 명령문에 값을 전달하는 위치를 표시할 수 있습니다. 또한 name 또는 ?#.name을 사용할 수 있습니다. name은 java.util.Map<String> 오브젝트 또는 Bean 내에서 등록 정보를 참조해야 합니다. 매개변수 표시문자에 대한 자세한 정보는 SQL문의 매개변수 표시문자를 참조하십시오.
data.startBatch(HeterogeneousBatchKind.heterogeneousModify_);이 메소드를 호출한 후, pureQuery는 응용프로그램이 Data 인터페이스의 동일한 구현에 대해 실행하기 위해 요청하는 모든 SQL문을 큐에 넣습니다. pureQuery는 응용프로그램이 endBatch() 메소드를 호출할 때까지 이러한 SQL문을 계속 큐에 넣습니다. pureQuery는 명령문을 큐에 넣으면서 해당 명령문이 성공적으로 실행되었음을 표시하는 더미 결과를 응용프로그램에 리턴합니다.
응용프로그램은 INSERT, UPDATE 및 DELETE문만 실행하도록 요청할 수 있습니다. pureQuery는 다른 유형의 SQL문을 모두 거부하고 해당 명령문은 사용자 연결에 대해 실행되지 않습니다. 응용프로그램이 다른 유형의 SQL문을 제출하는 경우, pureQuery는 예외를 발생시키고 일괄처리를 위해 큐에 대기된 모든 명령문을 지웁니다. 또한 pureQuery는 예외를 발생시킨 원인이 되는 명령문을 실행하지 않습니다.
응용프로그램이 endBatch() 메소드를 호출하기 전에 startBatch() 메소드를 다시 호출하는 경우, pureQuery는 일괄처리 프로세스를 중지하고 큐에 대기된 명령문을 지운 다음 RuntimeException을 발생시킵니다.
int[][] endBatch();pureQuery는 한 번의 네트워크 일주에서 큐에 대기된 명령문을 실행합니다. 메소드는 update() 및 updateMany() 메소드가 리턴했을 2차원 정수 배열의 갱신 계수를 리턴합니다. 첫 번째 차원의 크기는 응용프로그램이 SQL문을 실행하기 위해 제출한 요청의 수와 동일합니다. 두 번째 차원의 크기는 다음 중 하나입니다.
HeterogeneousBatchKind getBatchKind();일괄처리가 진행 중인 경우, 메소드는 heterogeneousModify_를 리턴합니다. 일괄처리가 진행 중이 아닌 경우, 메소드는 hetergeneousNone_을 리턴합니다.
응용프로그램이 startBatch() 메소드와 endBatch() 메소드 사이에 updateMany() 메소드를 호출할 수 있습니다. updateMany() 메소드는 단일 데이터베이스 오브젝트에 대해 SQL INSERT, UPDATE 또는 DELETE문을 여러 번 실행할 수 있습니다. 이 메소드에 대한 자세한 정보는 Data 인터페이스의 updateMany() 메소드를 사용한 단일 데이터베이스 오브젝트에 대한 일괄처리 갱신을 참조하십시오.
SQL문을 일괄처리 갱신의 일부로 실행하는 모든 인라인 메소드 및 어노테이션이 있는 메소드는 동일한 Data 오브젝트를 공유해야 합니다. 이는 사용자 응용프로그램이 사용하는 pureQuery 메소드의 혼합에 따라 조금씩 다르게 수행됩니다.
Data data = DataFactory.getData(jdbcConnection); data.startBatch(...); // other Data methods that use the Data instance "data" data.endBatch();사용자가 원하는 경우, 응용프로그램은 endBatch() 메소드를 호출한 후 Data 인스턴스를 여러 가지 용도로 사용할 수 있습니다.
Data data = DataFactory.getData (jdbcConnection); // now use "data" to instantiate the interfaces that will be used EmployeeInterface emp = DataFactory.getData (EmployeeInterface.class, data); DepartmentInterface dept = DataFactory.getData (DepartmentInterface.class, data); data.startBatch(...); // other Data and Annotated (EmployeeInterface and DepartmentInterface) methods data.endbatch();
EmployeeInterface emp = DataFactory.getData (EmployeeInterface.class, jdbcConnection); DepartmentInterface dept = DataFactory.getData (DepartmentInterface.class, (Data) emp); Data data = (Data) emp; data.startBatch(...); // other Annotated (EmployeeInterface and DepartmentInterface) methods data.endbatch();
데이터베이스에 대해 startBatch()와 endBatch() 사이의 모든 SQL문은 하나의 트랜잭션을 표시합니다. startBatch()와 endBatch() 호출 사이에 commit() 또는 rollback()을 호출하면 일괄처리가 실행되지 않는 원인이 되며 큐에 대기된 요청이 유실됩니다. 마지막으로 pureQuery는 RuntimeException을 발생시킵니다.
하나 이상의 SQLException이 JDBC 드라이버에서 리턴되는 경우, 해당 예외는 UpdateManyException 내에서 랩핑됩니다.
endBatch() 메소드로 인해 UpdateManyException이 발생되는 경우, 응용프로그램이 int[][] getHeterogeneousUpdateCounts() 메소드를 호출할 수 있습니다. 이 메소드는 갱신 계수를 일괄처리가 정상적으로 완료된 경우 리턴되는 대로 2차원 정수 배열로 리턴합니다.