매개변수가 있는 일괄처리 이기종 업데이트

pureQuery를 사용하여 다른 테이블을 참조하는 INSERT, UPDATE 및 DELETE문을 일괄처리할 수 있습니다. 이러한 이기종 일괄처리 업데이트를 통해 서버까지 한 번의 네트워크 일주로 모든 연관 테이블을 업데이트할 수 있습니다. 이러한 이기종 일괄처리 업데이트 방법을 사용하여 사용자는 pureQuery에 일괄처리 업데이트를 시작함을 표시하는 메소드를 호출합니다.
제한사항: 이 기능을 사용하기 위해서는 애플리케이션이 Linux, UNIX, Windows 또는 z/OS®에서 실행 중인 DB2® 데이터베이스에 대해 SQL문을 실행해야 합니다. 애플리케이션은 JDBC 및 SQLJ용 IBM® 데이터 서버 드라이버를 사용하여 해당 데이터베이스에 연결해야 합니다. 사용 중인 pureQuery의 버전에 필요한 이 드라이버의 버전을 찾으려면 시스템 요구사항을 참조하십시오.

애플리케이션이 표시된 연결에서 실행하기 위해 요청하는 모든 후속 SQL문은 메모리의 큐에 대기되어 있습니다. pureQuery는 각 명령문이 아직 실행되지 않은 경우에도 성공적으로 실행되었음을 표시하는 더미 결과를 애플리케이션에 리턴합니다. 사용자가 pureQuery에 일괄처리 업데이트를 종료 중임을 표시하는 메소드를 호출합니다. 이때, pureQuery는 큐에 대기된 모든 SQL문을 실행합니다.

SQL문에 물음표("?")를 사용하여 메소드가 해당 명령문에 값을 전달하는 위치를 표시할 수 있습니다. 또한 name 또는 ?#.name을 사용할 수 있습니다. namejava.util.Map<String> 오브젝트 또는 Bean 내에서 특성을 참조해야 합니다. 매개변수 표시문자에 대한 자세한 정보는 SQL문의 매개변수 표시문자를 참조하십시오.

일괄처리 프로세스

  1. SQL문의 일괄처리 시작을 표시하는 startBatch() 메소드를 호출하십시오.
    data.startBatch(HeterogeneousBatchKind.heterogeneousModify_);
    이 메소드를 호출한 후, pureQuery는 애플리케이션이 Data 인터페이스의 동일한 구현에 대해 실행하기 위해 요청하는 모든 SQL문을 큐에 넣습니다. pureQuery는 애플리케이션이 endBatch() 메소드를 호출할 때까지 INSERT, UPDATE 및 DELETE문을 계속 큐에 넣습니다. pureQuery는 명령문을 큐에 넣으면서 해당 명령문이 성공적으로 실행되었음을 표시하는 더미 결과를 애플리케이션에 리턴합니다.

    애플리케이션은 INSERT, UPDATE 및 DELETE문만 실행하도록 요청할 수 있습니다. pureQuery는 다른 유형의 SQL문을 모두 거부하고 해당 명령문은 사용자 연결에 대해 실행되지 않습니다. 애플리케이션이 다른 유형의 SQL문을 제출하는 경우, pureQuery는 예외를 발생시키고 일괄처리를 위해 큐에 대기된 모든 명령문을 지웁니다. 또한 pureQuery는 예외를 발생시킨 원인이 되는 명령문을 실행하지 않습니다.

    애플리케이션이 endBatch() 메소드를 호출하기 전에 startBatch() 메소드를 다시 호출하는 경우, pureQuery는 일괄처리 프로세스를 중지하고 큐에 대기된 명령문을 지운 다음 RuntimeException을 발생시킵니다.

  2. SQL문의 일괄처리 종료를 표시하고 pureQuery가 큐에 대기된 명령문을 실행하는 원인이 되는 endBatch() 메소드를 호출하십시오.
    int[][] endBatch();
    pureQuery는 한 번의 네트워크 일주에서 큐에 대기된 명령문을 실행합니다. 메소드는 update() 및 updateMany() 메소드가 리턴했을 2차원 정수 배열의 업데이트 계수를 리턴합니다. 첫 번째 차원의 크기는 애플리케이션이 SQL문을 실행하기 위해 제출한 요청의 수와 동일합니다. 두 번째 차원의 크기는 다음 중 하나입니다.
    1
    update() 메소드가 일괄처리되었음을 표시합니다.
    n
    updateMany() 메소드가 일괄처리된 경우, n은 updateMany() 메소드의 데이터 행 수입니다.
애플리케이션에서 startBatch() 메소드는 제출되었지만 endBatch() 메소드는 아직 제출되지 않았는지 여부를 알아내야 하는 경우, 애플리케이션은 getBatchKind() 메소드를 사용할 수 있습니다.
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();
어노테이션이 있는 메소드만 사용
첫 번째 인터페이스를 인스턴스화한 다음 해당 인터페이스를 사용하여 기타 인터페이스를 모두 인스턴스화하십시오. DataFactory가 리턴하는 구현은 Data 인터페이스의 구현을 확장합니다. 구현에서 데이터 메소드를 호출하기 위해 구현을 데이터 유형에 캐스트합니다.
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();
주의: 데이터 오브젝트는 스레드 안전하지 않습니다. 여러 스레드에서 공유하지 마십시오. Data 오브젝트가 작성된 동일한 스레드에서만 사용하십시오.

예외

데이터베이스에 대해 startBatch()와 endBatch() 사이의 모든 SQL문은 하나의 트랜잭션을 표시합니다. startBatch()와 endBatch() 호출 사이에 commit() 또는 rollback()을 호출하면 일괄처리가 실행되지 않는 원인이 되며 큐에 대기된 요청이 유실됩니다. 마지막으로 pureQuery는 RuntimeException을 발생시킵니다.

하나 이상의 SQLException이 JDBC 드라이버에서 리턴되는 경우, 해당 예외는 UpdateManyException 내에서 랩핑됩니다.

endBatch() 메소드로 인해 UpdateManyException이 발생되는 경우, 애플리케이션이 int[][] getHeterogeneousUpdateCounts() 메소드를 호출할 수 있습니다. 이 메소드는 업데이트 계수를 일괄처리가 정상적으로 완료된 경우 리턴되는 대로 2차원 정수 배열로 리턴합니다.


피드백