JDBC アプリケーション内にある SQL ステートメントの静的実行の構成

pureQuerySQL Outline を使用すると、 JDBC を用いてデータベースに接続する Java アプリケーションに組み込まれている SQL ステートメントを、動的ではなく静的に実行できます。
  • IBM Data Server Driver for JDBC and SQLJ、 リリース 3.53 以上
  • JRE 1.5 以上
  • 次の 1 つ以上のサポートされているタイプのデータベース:
    • DB2 Database for Linux, UNIX, and Windows v8.x、v9.1.x、v9.5
    • DB2 Database for z/OS v7、v8、v9
    • DB2 Database for i5/OS v5r2、v5r3、v5r4
    • Informix Dynamic Server (IDS) v9.x、v10.x、v11 (IDS がサポートされているのは SQL ステートメントのキャプチャーのみで、それらのバインドまたは静的実行ではサポートされていません。ワークベンチは、pureQuery アウトライン・ビューへの入力として pureQueryXML ファイルを使用できます。)
SQL Outline は SQL の静的実行をサポートする他のテクノロジーとは以下の点で異なっています。
  • COBOL プログラミング言語で組み込み SQL に使用するようなプリプロセッサーは使用しません。
  • SQLJ とは異なり、変換プログラムまたはカスタマイザーは使用しません。
  • アプリケーションのソースに SQL ステートメントをハードコーディングする必要がありません。

SQL Outline では、こうしたコンポーネントも必要としませんし、コードに変更を加えることも不要で、むしろ JDBC ドライバーがアプリケーションと相互作用する方法を変更します。

静的 SQL には、以下の利点があります。
動的ステートメント・キャッシュの回避
静的 SQL を使用することにより、DB2 の動的ステートメント・キャッシュの競合は削減され、動的 SQL を使用するアプリケーションのパフォーマンスは改善されます。
アクセス・パスの整合性
静的 SQL は、アプリケーションが実行される前にアクセス・パスでロックすることによって、応答時間を予測可能かつ安定したものにします。これとは対照的に、動的 SQL のアクセス・パスは実行時に計算されます。
アプリケーションのパフォーマンスを改善することが可能
静的 SQL はご使用のアプリケーションのパフォーマンスを改善することができます。
  • アクセス・プランは実行時の前に決定されるため、実行時に準備済み SQL ステートメントを使用する必要はありません。
  • 各ステートメントを準備して記述する必要がないため、クライアント・アプリケーションとデータベース・サーバーとの間のネットワーク・トラフィックが軽減されます。
  • 静的 SQL は、述部で使用されるホスト変数またはパラメーターのデータ・タイプを厳密に規定します。 これが厳密に規定されることにより、入力データはデータベース内のターゲット・タイプと必ず一致するようになります。
より堅固なセキュリティー
ユーザーに、データベース・オブジェクトに対する特権ではなく、DB2 パッケージに対する EXECUTE 特権を付与します。
パッケージ改訂のしやすさ
DB2 パッケージのバージョン管理によって、より良い以前のアクセス・パスを失うことなく、パッケージを再バインドすることができます。

z/OS 上でアプリケーションを実行する場合、JDBC タイプ 2 接続を使用してデータベースに接続できます。JDBC タイプ 2 ドライバーは、Java およびネイティブ・コードの組み合わせであるため、タイプ 2 接続は一般にタイプ 4 接続よりもパフォーマンスの点で優れています。

JDBC アプリケーション内にある SQL ステートメントを静的に実行するには、以下のようにします。

  1. 静的に実行したい SQL ステートメントを取り込みます。
  2. 次のステップで、キャプチャーされた SQL ステートメントから作成する DB2 パッケージを構成するためのオプションを指定します。
  3. SQL ステートメントが含まれる DB2 パッケージを作成およびバインドします。
  4. JDBC アプリケーションを実行して、キャプチャーされた SQL ステートメントを静的に実行します。

この例では、以下のような簡単な JDBC アプリケーションを使用します。

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 ステートメントは XML ファイル内に記録されます。このファイルは、pureQueryXML ファイルと呼ばれます。
このステップを実行する 1 つの方法は、JVM システム・プロパティーを使用した以下のような方法になります。
java –Ddb2.jcc.pdqProperties=captureMode(on),pureQueryXml(Sample1Cptr.pdqxml) Sample1
Sample1 の完了後、現行ディレクトリーに pureQueryXML ファイルが Sample1Cptr.pdqxml. という名前で存在します。

1 つの pureQueryXML ファイル内のすべてのステートメントが、StaticBinder によって一緒にパッケージ化されます。そのため、ご使用のアプリケーションが複数のデータベースに接続して SQL を実行する場合には、それぞれの Connection URL または DataSource オブジェクトごとに 1 つの pureQueryXML ファイルを作成する必要があります。

大規模なアプリケーションでは、徐々に SQL ステートメントをキャプチャーするように選択できます。 初期実行の際に幾らかの SQL ステートメントをキャプチャーし、その後の実行の際に残りの SQL ステートメントを同じファイル (複数も可) にキャプチャーできます。ただし、アプリケーションのソースを変更した場合 (複数の pureQueryXML ファイルをセットアップするときに異なる Connection オブジェクトの URL を変更する場合は除く)、 pureQueryXML ファイルを削除してから、キャプチャー・プロセスを再開しなければなりません。

JDBC アプリケーションのテスト中に SQL ステートメントをキャプチャーしてください。その際、アプリケーションを実稼働環境にデプロイする際に使用する予定のデータベースと類似のデータベースに対して、それらの SQL ステートメントを実行します。

ステップ 2: DB2 パッケージの構成
pureQueryXML ファイルで Configure ユーティリティーを実行するときに、次のステップで StaticBinder を使用して作成する DB2 パッケージのルート・パッケージ名を指定します。また、デフォルト値を受け入れない場合には、コレクション ID とバージョン ID も指定できます。Configure ユーティリティーはこの情報を pureQueryXML ファイルに格納しますので、後ほどこれを StaticBinder に提供してください。
以下に示すのは、Configure ユーティリティーの実行方法の 1 つです。
java com.ibm.pdq.tools.Configure -pureQueryXml Sample1Cptr.pdqxml –rootPkgName SMPL1 -collection COLL01

Configure ユーティリティーを pureQueryXML ファイルで実行してから、そのファイルにさらに SQL ステートメントをキャプチャーする場合には、Configure ユーティリティーをキャプチャー・ファイル上で再実行する必要があります。

Configure ユーティリティーを pureQueryXML ファイルで実行しない場合、その pureQueryXML ファイル内にある SQL ステートメントをバインドしようとすると、StaticBinder が例外をスローします。

ステップ 3: DB2 パッケージへの SQL ステートメントのバインド
pureQueryXML ファイルで Configure ユーティリティーを実行した後、pureQuery StaticBinder ユーティリティーを実行して、pureQueryXML ファイル内にリストされている SQL ステートメントをパッケージ化できます。
以下に示すのは、StaticBinder ユーティリティーの実行方法の 1 つです。
java com.ibm.pdq.tools.StaticBinder –url jdbc:db2://svl01:500/DB2M -username user01 -password myPass -pureQueryXml Sample1Cptr.pdqxml
ステップ 4: アプリケーションの実行
アプリケーションの実行モードを STATIC に設定して実行すると、pureQueryXML ファイル内の情報によって、pureQueryではキャプチャーされた SQL ステートメントを静的に実行できます。
以下に示すのは、アプリケーション Sample1 の開始方法の 1 つです。
java -Ddb2.jcc.pdqProperties=executionMode(STATIC),pureQueryXml(Sample1Cptr.pdqxml) Sample1

デフォルトでは、キャプチャーされていない SQL ステートメントをアプリケーションが動的に実行できます。

関連概念
pureQuery API を使用するアプリケーションの開発

フィードバック