pureQuery가 아닌 API 애플리케이션에서 정적으로 SQL문 실행

pureQuery의 클라이언트 최적화를 사용하는 경우, JDBC를 사용하여 데이터베이스에 연결하는 Java™ 애플리케이션에 임베드된 SQL문을 동적이 아닌 정적으로 실행할 수 있습니다.

시작하기 전에

시스템이 하드웨어 및 소프트웨어 요구사항을 충족하는지 확인하십시오. Optim™ pureQuery Runtime에 대한 시스템 요구사항을 참조하십시오.

이 태스크 정보

클라이언트 최적화는 SQL 정적 실행을 지원하는 다른 기술과 다릅니다.
  • COBOL 프로그래밍 언어가 Embedded SQL에 대해 사용하는 것과 다르게 선행 처리기를 사용하지 않습니다.
  • SQLJ와 다르게 변환기 또는 사용자 정의기를 사용하지 않습니다.
  • SQL문을 애플리케이션의 소스로 하드코드화할 필요가 없습니다.

코드에 대해 이러한 구성요소나 변경사항을 필요로 하는 대신에, 클라이언트 최적화는 JDBC 드라이버가 애플리케이션과 상호 작용하는 방법을 변경합니다.

프로시저

pureQuery가 아닌 API 애플리케이션에 있는 SQL문을 정적으로 실행하려면 다음을 수행하십시오.

  1. 정적으로 실행하려는 SQL문을 캡처하십시오.
  2. 다음 단계에서 캡처된 SQL문에서 작성할 DB2® 패키지 구성을 위한 옵션을 지정하십시오.
  3. SQL문을 포함하는 DB2 패키지를 작성하고 바인드하십시오.
  4. 캡처된 SQL문이 정적으로 실행되도록 pureQuery가 아닌 API 애플리케이션을 실행하십시오.

이 예는 다음과 같은 단순한 pureQuery가 아닌 API 애플리케이션을 사용합니다.

import java.sql.*;
import com.ibm.db2.jcc.*;
public class Sample1
{
	public static void main (String[] args) throws SQLException, ClassNotFoundException
	{
		Connection jdbcCon=null;
		try {
			Class.forName("com.ibm.db2.jcc.DB2Driver");
			jdbcCon=DriverManager.getConnection(
				"jdbc:db2://svl01:500/DB2M", "user01", "myPass");
		}
		catch (SQLException e) {
			System.out.println(e);
		}
		try {
			PreparedStatement pStmt = jdbcCon.prepareStatement(
				"INSERT INTO ADMF001.VIEW1(C1, C3, C2) VALUES(?,?,?)");
			pStmt.setString(1, "1");
			pStmt.setInt(2, 3);
			pStmt.setDouble(3, 2.0e3);
			pStmt.executeUpdate();
			pStmt.close();

			Statement selStmt = jdbcCon.createStatement(
				ResultSet.TYPE_FORWARD_ONLY,
				ResultSet.CONCUR_UPDATABLE);
				ResultSet rs = selStmt.executeQuery(
					"SELECT * FROM ADMF001.VIEW1 WHERE C2 > 200");
			System.out.println("moving to the first row");
			if (rs.next()) {
				System.out.println("deleting it");
				Statement stmt = jdbcCon.createStatement();
				stmt.executeUpdate(
					"DELETE FROM ADMF001.VIEW1 WHERE CURRENT OF "
					+ rs.getCursorName());
				stmt.close();
				}
			selStmt.close();
		}
		catch (SQLException e) {
			System.out.println( "Sample1: " + e );
		}
		jdbcCon.close();
	} //end main
} // end class Sample1
1단계: 애플리케이션에 있는 SQL문 캡처
캡처 모드에서 애플리케이션을 실행하고 정적 실행에 관심이 있는 SQL문을 실행하십시오. 성공적으로 실행되는 SQL문은 pureQueryXML 파일이라고 하는 XML 파일에 기록됩니다.
captureMode를 ON으로 설정하고 pureQueryXML 파일을 지정하기 위한 한 가지 방법은 이 컨텐츠가 있는 일반 텍스트 pdq.properties 파일을 사용하는 것입니다.
pdq.captureMode=ON
pdq.pureQueryXml=Sample1Cptr.pdqxml
애플리케이션이 완료된 후 pureQueryXML 파일은 현재 디렉토리에 존재하고 Sample1Cptr.pdqxml이라는 이름을 갖습니다.

단일 pureQueryXML 파일의 모든 명령문이 StaticBinder에 의해 함께 패키지됩니다. 따라서 애플리케이션이 둘 이상의 데이터베이스에 연결되고 이에 대해 SQL을 실행하는 경우, 각 연결 URL 또는 DataSource 오브젝트에 대해 pureQueryXML 파일을 작성해야 합니다.

더 큰 애플리케이션에 대해서는 SQL문을 증분식으로 캡처하도록 선택할 수 있습니다. 초기 실행에서 많은 SQL문을 캡처하고 이후 실행에서 나머지 SQL문을 동일한 파일에 캡처할 수 있습니다. 그러나 여러 개의 pureQueryXML 파일을 설정하는 경우 다른 Connection 오브젝트의 URL을 수정하지 않고 애플리케이션의 소스를 수정하면 pureQueryXML 파일을 삭제하고 캡처 프로세스를 다시 시작해야 합니다.

pureQuery가 아닌 API 애플리케이션을 테스트하고 프로덕션 환경에 애플리케이션을 전개할 때 사용할 계획인 데이터베이스와 유사한 데이터베이스에 대해 SQL문을 실행하는 동안 해당 명령문을 캡처해야 합니다.

2단계: DB2 패키지 구성
pureQueryXML 파일에서 Configure 유틸리티를 실행할 때 다음 단계에서 StaticBinder를 사용하여 작성하는 DB2 패키지의 루트 패키지 이름을 제공합니다. 또한 기본 값을 승인하지 않으려는 경우 콜렉션 ID 및 버전 ID를 제공할 수 있습니다. Configure 유틸리티는 사용자가 나중에 StaticBinder에 제공하는 pureQueryXML 파일에 이 정보를 저장합니다.
Configure 유틸리티를 실행하는 한 가지 방법은 다음과 같습니다.
java com.ibm.pdq.tools.Configure -pureQueryXml Sample1Cptr.pdqxml –rootPkgName SMPL1 -collection COLL01

pureQueryXML 파일에서 Configure 유틸리티를 실행한 다음 해당 파일에 SQL문을 추가로 캡처하는 경우, 파일에서 Configure 유틸리티를 다시 실행해야 합니다.

3단계: SQL문을 DB2 패키지에 바인드
pureQueryXML 파일에서 Configure 유틸리티를 실행한 후 pureQuery StaticBinder 유틸리티를 실행하여 pureQueryXML 파일에 나열된 SQL문을 패키지할 수 있습니다.
StaticBinder 유틸리티를 실행하는 한 가지 방법은 다음과 같습니다.
java com.ibm.pdq.tools.StaticBinder –url jdbc:db2://svl01:500/DB2M -username user01 -password myPass -pureQueryXml Sample1Cptr.pdqxml
4단계: 애플리케이션 실행
실행 모드가 STATIC으로 설정된 애플리케이션을 실행할 때, pureQueryXML 파일의 정보를 사용하여 pureQuery는 캡처된 SQL문을 정적으로 실행할 수 있습니다.
실행 모드와 pureQueryXML 파일을 설정하는 한 가지 방법은 1단계에서 작성한 pdq.properties 파일을 수정하는 것입니다.
pdq.executionMode=STATIC
pdq.pureQueryXml=Sample1Cptr.pdqxml

기본으로 애플리케이션은 사용자가 캡처하지 않은 모든 SQL문을 동적으로 실행할 수 있습니다.


피드백