IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  WebSphere | Information Management  >

JPAとpureQueryの統合: Java Persistence APIでDB2の静的SQL実行機能を活用する

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

ダウンロード

原文はこちら

原文はこちら


レベル: 中級

Fay Wang, Advisory Software Engineer, IBM
Catalina Wei, Senior Software Engineer, IBM
David Wisneski, Senior Software Engineer, IBM
Asim Singh, Staff Software Engineer, IBM

2008年 12月 10日

Journal icon IBM® WebSphere® Application Server V7はIBM DB2®へのデータアクセスを最適化するためにJava™ Persistence API (JPA)の拡張実装を提供しており、拡張されたセキュリティ機能や、データアクセスのオーバーヘッドを大きく削減できる可能性のある機能を提供しています。この最適化は、WebSphere JPAとIBM Data Studio pureQueryランタイムの統合機能によって静的SQLアクセスを有効にすることで実現できます。アプリケーションのコードを変更したり、テストケースを追加実行したりする必要はありません。この記事では、サンプルJPAアプリケーションを利用して、JPA/pureQuery統合により静的SQLを有効にするための手順をご紹介します。オプションの追加手順として、実行時における追加クエリーをキャプチャーするための、pureQueryクライアントの最適化機能を利用する方法についてもご紹介します。

IBM WebSphere Developer Technical Journalより.

はじめに

IBM WebSphere Application Server V7 はpureQueryをサポートする拡張されたJava Persistence API (JPA)実装を提供しており、そのためDB2の静的SQLを利用することができます。この記事では、IBM Data Studio pureQuery Runtime が提供する静的SQLのパフォーマンスおよびセキュリティ上の利点を活用する方法をご紹介すると同時に、JPAの提供する完全なO-Rマッピング機能の利用についてもご紹介します。それはケーキを口に運んで食べるのと同じくらい簡単です。

次のセクションで、静的SQLとpureQueryに関する簡単に紹介しています。この記事では、動的アクセス(JDBC)とJPA経由の静的アクセス(pureQuery)について、より詳細に比較対照を行います。後ほど、SQLを生成するためにWebSphere Application Server V7が提供する静的ジェネレーターユーティリティ(wsdb2gen)の利用方法、および生成されたSQLをDB2パッケージにバインドする方法についてご紹介します。この記事の最後では、ここでご説明する静的ジェネレーター機能を補完する機能として、pureQueryクライアントの最適化機能の概要についてご紹介します。

前提条件

この記事ではJPAに関する基本的な知識は既知であることを前提としています。背景となる情報については、参考文献 をご参照ください。この記事で紹介している手順を実行するためには、pureQueryランタイムが必要になります。このためには、Data Studio Developerに含まれるpureQueryランタイムが利用可能です。Data Studio Develperの評価版はこちら(US)からダウンロードできます。




上に戻る


基礎知識

静的SQLとは?

DB2の静的SQLは、実行時のデータアクセスを効率化するための強力な機能で、データベースのアクセスパスを決定するなどの一部の作業をあらかじめ行っておくことができます。これにより、実行時のパフォーマンスを向上し、より安定させることができます。


図1. 静的実行は動的実行よりも効率的

静的SQLに対するセキュリティモデルも、動的SQLとは異なります。静的SQLに対しては、ユーザーはバインド作業の出力結果(パッケージ)を実行する権限のみを割り当てられます。パッケージにはSQL文が含まれています。言い換えると、あるテーブルに対するアクセスがすべて静的であれば、DBAはテーブルやビューに対してアクセス権を付与する必要はなく、パッケージに対してのみアクセス権を付与すればよいということです。それに加えて、静的に実行されるSQLが多くなればなるほど、悪意のあるインジェクション攻撃を受ける機会が少なくなります。インジェクション攻撃は、動的SQLのセキュリティ問題として有名です。

静的SQLの詳細については、 参考文献 をご参照ください。

pureQueryとは?

pureQueryはハイパフォーマンスなデータアクセスプラットフォームです。pureQueryによって、開発が容易になり、管理された最適でセキュアなデータアクセスを実現することができます。pureQueryは以下の要素から構成されます。

  • ベストプラクティスを踏まえてシンプル化した、使いやすいAPI
  • JavaおよびSQL開発が可能な開発ツールData Studio Developer.
  • データベースアクセスを最適化し、管理作業をシンプルにするためのData Studio pureQueryランタイム

pureQueryは、パフォーマンス面で最適化された方法でデータアクセスのコードを書くのに役立ちます。加えて、DB2へのデータアクセスを静的SQLに切り替えることが簡単なため、パフォーマンス向上(静的SQLは一般に高速です)とセキュリティ強化を支援してくれます。pureQueryにはJDBCやSQLJに比べ多くの利点があります。例えば、pureQueryは専用の加工ツールを必要としませんし、静的実行のためにアプリケーションのソースコード内にSQL文をハードコードする必要もありません。

WebSphere Application Server V7が提供するpureQuery統合機能を利用するためには、 Data Studio pureQuery Runtimeを別途購入する必要があります。Data Studio Developerは現在のところオプション製品です。

pureQueryに関する追加情報は、参考文献 をご参照ください。




上に戻る


JPAの動的実行:JDBC

EJB 3 Feature Packでは、プラグインJARのファイル名はcom.ibm.ws.jpa_6.1.0.jar でした。 WebSphere Application Server V7 では、JARのファイル名はcom.ibm.ws.jpa.jar に変更されています。

WebSphere Application Server V6.1 Feature Pack for EJB™ 3 では、JPA実装はデータベースサーバーへのアクセスAPIとしてJDBCを利用しています。毎回のJDBC呼び出しは動的であり、実行時にSQL文の解析と最適化を行う必要があります。図2は、JDBCを利用した場合の、JPAアプリケーションからデータベースまでの処理のフローを示しています。


図2. JDBC利用時のアプリケーションからデータベースへのフロー




上に戻る


JPAの静的実行:pureQuery

WebSphere Application Server V7 では、DB2へのアクセスにJDBCを利用する以外に、pureQueryが選択できるようになりました。pureQueryを利用した場合の、JPAアプリケーションからデータベースへの処理フローを図3に示します。


図3. pureQuery利用時のアプリケーションからデータベースへのフロー

図3で示したように、pureQueryを利用して静的SQLを有効にする作業は以下のステップから構成されます。

  • 生成時ステップ:SQLを収集し、DB2パッケージを作成
  • 実行時ステップ:JPAのデータベース呼び出しはpureQueryのランタイムに転送され、さらに事前に処理済みのSQL分を含む適切なDB2パッケージに転送される。



上に戻る


生成時ステップ:SQL文の収集とデータベース・パッケージの作成

SQL文を収集するためのJPAユーティリティーは、静的ジェネレーターと呼ばれます。図3.で示した通り、静的ジェネレーターは%WAS_HOME%\bin ディレクトリーのwsdb2genで起動します。このユーティリティーはパーシステンス・ユニット名およびその他のパラメータ-を入力として受け取り、保存・削除・更新・検索といった全てのエンティティ操作に必要となるSQL文を含むファイルを生成します。また、JPAの名前付きクエリーを実行するために必要となるSQL分も生成します。動的クエリー(名前付きクエリーの反対)に対するSQL文は静的ジェネレーターで生成することはできません。(これらのSQL文をpureQueryクライアント最適化機能で実行時にキャプチャーする方法については、後で議論します。)

このツールを実行する前に、pdqランタイムJAR、db2jcc JAR、エンティティクラスのJAR(ないしは拡張済みエンティティクラスの存在するディレクトリー)およびpersistence.xmlファイルをクラスパスに設定しておく必要があることに注意してください。

この記事の読者のために、ダウンロードセクションにJPA_EE_SAMPLE.ear ファイルを用意しました。SQL文を収集してパッケージを作成するまでの一通りの手順を実行するサンプルとしてご利用下さい。このサンプル・アプリケーションでは、注文情報の作成・更新・削除が実行できます。このサンプルのパーシスタンス・ユニット名はJPASampleです。

静的バインダー・ユーティリティーによるSQL生成

リスト1はコマンドラインからの静的バインダー・ユーティリティーwsdb2genの起動方法と文法を示しています。


リスト1. コマンドラインからのwsdb2genの実行
C:\was70\bin>wsdb2gen
Syntax: WSDB2GEN -pu <puName> [Flags]
  Where
               puName           Persistence-unit name defined in the
                                persistence.xml

  -collection  collectionId     Collection id assigned to package names.
                                Default is NULLID.

  -url         type 2 or        The URL is used to validate generated sql.
               type 4 url       If url option is specified, if overrides
                                the url value in the persistence.xml.

                                If the url is type 4, userid and password

                                are required for connection. If the url is
                                type2, userid and password are not required.

  -user        user             The userid to connect to target datebase.
                                If user option is specified, it overrides
                                the user value in the persistence.xml.

  -pw          password         The password to connect to target datebase.
                                If password option is specified, it
                                overrides the value in the persistence.xml.

  -package     packageName      A name of 7 or fewer characters for the
                                package name. If specified, all SQL for
                                the application will be generated into
                                this single package. If package option
                                is not specified, then multiple packages
                                will be created; one for each entity
                                class. If the first 7 characters are not
                                unique, the package name will be changed
                                to ensure uniqueness.

  -help


C:\was70\bin>set classpath=C:\db2jcc.jar;C:\pdq.jar;C:\pdqmgmt.jar;%classpath%

C:\was70\bin>set classpath=C:\test1\bin;%classpath%

C:\was70\bin>wsdb2gen -pu JPASample -url jdbc:db2://localhost:50000/demodb -user
 db2admin -pw passw0rd

リスト1で確認できるように、JPASampleに対してユーティリティーを実行するためのコマンドは以下のようになります。

wsdb2gen –pu JPASample –url jdbc:db2://localhost:50000/demodb –user db2admin –pw passw0rd

コマンドを実行すると、パーシステンス・ユニット名に拡張子.pdqxmlを付けたファイルが出力されます。今回の場合、ファイル名はJPASample.pdqxmlになります。pdqxmlファイルは、persistence.xmlファイルと同にディレクトリーに出力されます。pdqxmlファイルはアーカイブファイル内のpersistence.xml構成ファイルと同じ場所(通常はMETA-INFディレクトリー)に配置してパッケージングする必要があります。

コマンドラインでのパッケージのバインド

pureQueryの静的バインダーはpu.pdqxmlファイルを利用してDB2パッケージを作成します。静的バインダーはWebSphere Application Serverの管理コンソールか、wsadminコマンドから実行することができます。

  1. コマンドラインから次のように入力し、wsadminを開始します

    wsadmin -lang jython

  2. 静的バインダーを実行するためには、アプリケーションに含まれるバインドファイルを確認する必要があります。JPA_EE_SAMPLEアプリケーション内のバインドファイルの一覧を参照するには、次のコマンドを入力します。

    print AdminTask.listPureQueryBindFiles('[-appName JPA_EE_SAMPLE]')

  3. バインドファイルのファイル名が確認できたら、以下のコマンドで静的バインダーを実行できます。

    リスト2. 静的バインダーの実行コマンド
    print AdminTask.processPureQueryBindFiles(
    '[-appName JPA_EE_SAMPLE 
    -classpath [C:\\pdq.jar C:\\pdqmgmt.jar C:\\db2jcc.jar]
    -url jdbc:db2://localhost:50000/demodb 
    -user db2admin
    -password passw0rd 
    -options [-bindoptions "BLOCKING NO"]
    -files [JPA_W_EJB.jar\\META-INF\\JPASample.pdqxml]
    ]')

    注意:pdqmgmt.jarはpureQueryランタイムを実行するのに必要なライセンスを含んでいます。

  4. 次のコマンドで、processPureQueryBindFilesの詳細なヘルプが確認できます。

    print AdminTask.help('processPureQueryBindFiles')

リスト3は、これまで説明してきたコマンドとその実行結果です。デフォルトでは、パッケージごとに4つのフレーバーが作成されることがわかります。各パッケージ名には1から4の数値が追加されており、パッケージに対する分離レベルが識別できるようになっています。分離レベルはそれぞれデータベースのロック分離レベルに対応しています。


リスト3. コマンドラインツールでDB2パッケージを作成
C:\was70\bin>wsadmin -lang jython

wsadmin>print AdminTask.listPureQueryBindFiles('[-appName JPA_EE_SAMPLE]')
JPA_W_EJB.jar\META-INF\JPASample.pdqxml


wsadmin>print AdminTask.help('processPureQueryBindFiles')
WASX8006I: Detailed help for command: processPureQueryBindFiles

Description: Process the pureQuery bind files that are in an installed application.  Bind 
static SQL packages in a database.  Refer to the information center documentation for the 
pureQuery bind utility.

Target object:   None

Arguments:
  *appName - The name of an installed application that contains the pureQuery bind files 
to be processed.
  classpath - A list of the paths to the .jar files that contain the pureQuery bind 
utility and its dependencies: pdq.jar, pdqmgmt.jar, and db2jcc4.jar or db2jcc.jar.  
Use / or \\ as a file separator.  Use a blank space to separate the paths for the .jar 
files.
  *url - The URL for connecting to the database.  The format is jdbc:db2://server_name:
port/database_name.
  user - The user name for connecting to the database.
  password - The password for connecting to the database.
  options - Any additional options that are needed by the pureQuery bind utility.  
Provide bind options as: -bindoptions "options-string".  Refer to the information center 
documentation for the pureQuery bind utility.
  *files - A list of the names of the pureQuery bind files to be processed.  The bind 
file path names must be relative to the application .ear file that contains them.  
Use / or \\ as a file separator.  If you specify multiple file paths, use a blank space 
to separate them.

Steps:
  None

wsadmin> wsadmin>print AdminTask.processPureQueryBindFiles('[-appName JPA_EE_SAMPLE
 -classpath [C:\\pdq.jar C:\\pdqmgmt.jar C:\\db2jcc.jar ] -url jdbc:db2://localhost:50000
/demodb -user db2admin
 -password passw0rd -options [-bindoptions "BLOCKING NO"] -files [JPA_W_EJB.jar\\META-INF
\\JPASample
.pdqxml ]]')

IBM Data Studio pureQuery Runtime 1.2 build 1.3.98
Licensed Materials - Property of IBM
5724-U16
(c) Copyright IBM Corp. 2006, 2008 All Rights Reserved.


================================================================================


Package 'Order1' was bound successfully for isolation level UR.
Package 'Order2' was bound successfully for isolation level CS.
Package 'Order3' was bound successfully for isolation level RS.
Package 'Order4' was bound successfully for isolation level RR.
Package 'Custome1' was bound successfully for isolation level UR.
Package 'Custome2' was bound successfully for isolation level CS.
Package 'Custome3' was bound successfully for isolation level RS.
Package 'Custome4' was bound successfully for isolation level RR.
Package 'pkgseq1' was bound successfully for isolation level UR.
Package 'pkgseq2' was bound successfully for isolation level CS.
Package 'pkgseq3' was bound successfully for isolation level RS.
Package 'pkgseq4' was bound successfully for isolation level RR.
Bind completed successfully for the file 'META-INF\JPASample.pdqxml'.

Bind succeeded for <META-INF\JPASample.pdqxml>.

================================================================================



Binding results:

    Number of implementation classes and pureQueryXml files for which bind SUCCEEDED: 1
    Number of implementation classes and pureQueryXml files for which bind FAILED: 0


ADMA0510I: Results from pureQuery bind processing for JPA_W_EJB.jar\META-INF\JPASample.
pdqxml.  Return code: 0  Exception: null
ADMA0509I: The pureQuery bind operation on application JPA_EE_SAMPLE completed 
successfully.  Exit code: 0
0

wsadmin>

管理コンソールでのパッケージのバインド

パッケージをバインドするのには、WebSphere Application Server管理コンソールを使う方が簡単かもしれません。:

  1. JPA_EE_SAMPLE アプリケーションを選択してダブルクリックします(図4.)。

    図4. サンプルアプリケーションを選択


  2. データベース・プロファイルの下の右下のコンテナにある SQLJ profiles and pureQuery bind files をダブルクリックします(図5)。

    図5. 管理コンソールでSQLJ profiles and pureQuery bind files を選択


  3. 管理コンソール上で、アプリケーションに含まれるpdqxmlファイルが自動的に表示されます。pdqxmlファイルを選択してAdd ボタンをクリックします(図6)。

    図6. アプリケーション内のpdqxmlファイルを選択


  4. サンプルのpureQueryバインドファイル(JPASample.pdqxml)が選択され、バインドできるようになっています。データベースURL、ユーザーID、パスワードを入力し、クラスパスにpdq.jar; pdqmgmt.jar; db2jcc.jarを追加してOKをクリックします(図7)。

    図7. 管理コンソールでDB2パッケージを作成


  5. 図8の画面が表示されれば、バインドは成功です。

    図8. バインドが成功し、DB2パッケージが生成された


オプション:バインドオプションのカスタマイズ

EARファイル内にbindpropsファイルを配置することで、バインドオプションを細かくチューニングしたり、複数のpdqxmlファイルをバインドすることができます。リスト4は、3つのpdqxmlファイルを指定し、それぞれに対して異なるバインドオプションを設定するbindpropsファイルのサンプルです。


リスト4. bindpropsファイルのサンプル
# Artifact 1
META-INF\myPureQueryXmlFile1.pdqxml = -rootPkgName myPkg1 -bindOptions "bind options" 
-generateDBRM true -outputDBRMPath C:\myDRMDirectory5\myDBRMSubDirectory1 -isolationLevel
UR

# Artifact 2 
META-INF\myPureQueryXmlFile2.pdqxml = -rootPkgName myPkg2 -pkgVersion 
-ver6 

# Artifact 3 
META-INF\JPASample.pdqxml =

以下のいずれかの方法で、bindpropsファイルをpersistence.xmlやpdqxmlファイル(この場合はJPASample.pdqxml)と一緒にパッケージングすることができます。

  • 図9のように、EJB JARファイルのMETA-INFディレクトリーに格納する。
  • 図10のように、EARファイルのルートディレクトリー(JPA_EE_SAMPLE.ear)に直接格納する。

どちらの方法でも、WebSphere Application Server はバインドファイルを自動的に検出し、配置場所に応じて表示してくれます。


図9. JPA_W_EJB.jar/META-INFにパッケージングされたバインドファイル


図10. JPA_EE_SAMPLE.earのルートディレクトリーにパッケージングされたバインドファイル

bindpropsファイルに指定されたpdqxmlファイルのバインドに成功したら、静的SQLを使ってアプリケーションを動かすための準備は完了です。




上に戻る


実行時ステップ:pureQuery対応JPAアプリケーションを実行する

パッケージに実行権限を付与する(オプション)

リスト3では、JPASample.pdqxmlに含まれるSQL文をパッケージに対する権限設定なしでバインドしました。これは、パッケージの所有者がパッケージに対する実行権限を持つ唯一のユーザーであることを意味します。パッケージに対する実行権限をpublicにするには、grantキーワードを利用します。例えば、次のコマンドではパッケージに対する実行権限をpublicに設定しています。


リスト 5. Command to grant privileges
wsadmin>print AdminTask.processPureQueryBindFiles('[-appName JPA_EE_SAMPLE -classpath
[C:\\openjpadep\\pdq.jar C:\\openjpadep\\pdqmgmt.jar C:\\openjpadep\\db2jcc.jar ] -url 
jdbc:db2://localhost:50000/demodb -user db2admin -password passw0rd -options 
[-bindoptions "BLOCKING NO" -grant "grantees(public)"] -files [JPA_W_EJB.jar\META-INF\
JPASample.pdqxml]]')

特定のユーザー(例えばadmf002とadmf003)に権限を付与するには、次のようにします。

-grant "grantees(admf002, admf003)"

静的バインダーに対するgrantオプションは、WebSphere Application Server管理コンソールから追加できます。繰り返しになりますが、図7では追加のオプションが何も設定されていないので、所有者のみがパッケージに対する実行権限を持ちます。図11では追加のオプション -grant grantee(public) が設定されているので、パッケージに対するpublicな実行権限が与えられています。


図11. 管理コンソールでパッケージの実行権限をpublicに設定

サンプルアプリケーションの実行方法

この記事で提供しているサンプルアプリケーションは、直接WebSphere Application Server V7にデプロイすることもできますし、.earファイルをIBM Rational® Application Developer 7.5 のワークスペースにインポートすることもできます。ワークスペースにサンプルの.earファイルをインポートしたら、WebプロジェクトJPA_W_EJB_WEBをWebSphere Application Server V7上で実行できます。ブラウザーにこのURLを入力してサンプルアプリケーションを実行することもできます: http://localhost:9080/JPA_W_EJB_WEB/.


図12. サンプルの実行

静的SQLが実行されたことを確認するために、WebSphereのトレースを有効にします。トラブルシューティング => ログおよびトレース => server1 => 診断トレース => ログ詳細レベルの変更 を選択し、次の値を設定します。

*=info: JPA=all: openjpa=all: SystemErr=all: SystemOut=all: com.ibm.pdq=all

customerを追加してからWebSphereのtrace.logを開きます。次のトレースログが、customerを追加するためのSQLが実際に静的実行されたことの証拠です。

[11/24/08 12:07:30:239 PST] 00000016 OpenJPA 3 wsjpa.pdq: Trace: PDQ static sql: INSERT INTO SALES.CUSTOMER (id, name) VALUES (?, ?)




上に戻る


追加のSQLを発見しバインドするためにpureQueryクライアント最適化機能を利用する(オプション)

A明らかに、これまでに説明してきた方法ではアプリケーションが発行するすべてのSQL文が静的に実行されるわけではありません。例えば、動的なJPQLクエリーはwsdb2genで収集されません。アプリケーションによっては、wsdb2genによって収集できるものだけで十分かもしれません。しかし、静的ジェネレーターで収集することができないSQLが相当数あるならば、Data Studio DeveloperとpureQueryランタイムの提供するpureQueryクライアント最適化機能によってSQLの実行時にキャプチャーすることができます。ここでは手順の概要を紹介しますが、ぜひクライアント最適化機能のチュートリアル(US)を完了することをおすすめします。

既に説明した通り、クライアント最適化機能を使ってアプリケーション実行中にSQLをキャプチャーします。できれば、ほとんどのユースケース、あるいは全てのユースケースを実行する一連のテストケースのセットを実行するのがよいでしょう。この作業により、正常に実行できた動的SQL文を含むpdqxmlファイルが生成されます。それから、既にご説明した手順か、Data Studio Developerツール(チュートリアルに説明があります)を利用してファイルをバインドします。

図13はpureQueryクライアント最適化機能を利用した場合の、アプリケーションからデータベースまでのフローです。


図13. pureQueryクライアント最適化機能利用時のアプリケーションからデータベースまでのフロー

コマンドラインからクライアント最適化機能を有効にする

  1. EpureQueryキャプチャーを有効にします。pureQueryのキャプチャー機能は接続URLのパラメータで有効にできます。リスト6はpersistence.xmlファイルのConnectionPropertiesでキャプチャー機能を有効にする設定方法です。

    リスト6. 接続URLでSQLキャプチャーを有効化
      <!-- PDQ dynamic mode -->
      <property name="openjpa.ConnectionProperties"
    value="DriverClassName=com.ibm.db2.jcc.DB2Driver,Url='jdbc:db2://localhost:
    50000/demodb:pdqProperties=executionMode(DYNAMIC),captureMode(on),pureQueryXml
    (c://mycapture.pdqxml);',Username=db2admin,Password=passw0rd" />

    通常の接続URLに、pdqPropertiesを追加してキャプチャー機能を有効化し、キャプチャーしたSQL文を出力するファイル名を指定していることに注目して下さい。

  2. キャプチャー機能を有効化した後にやるべきことは、アプリケーションを実行することだけです。アプリケーションの実行中に、pureQueryは正常に実行できたすべての動的SQL文をキャプチャーします。言い換えると、静的バインダーで収集したSQL文は既に静的SQLに変換されているので、再びキャプチャーされることはありません。キャプチャーされたSQL文はpdqPropertiesで指定したファイルに出力されます。上記のサンプルで示したように、Cドライブ(c://mycapture.pdqxml)にmycapure.pdqxmlというファイルが見つかるでしょう。
  3. クラスパスにpdq.jarとpdqmgmt.jarを設定し、リスト7に示すようにConfigureユーティリティーを実行して、キャプチャーした情報に対するコレクション、パッケージおよびセクション番号の情報を追加します。

    重要: 必ず、静的ジェネレーターに対するものとは異なるパッケージ名やコレクションIDを使ってください。キャプチャーしたSQLにバインドするパッケージがユニークに生成され、ジェネレートしたSQLに対して生成したパッケージとは異なるようにしてください。これらに重複があると、アプリケーション実行時にSQLCODE -818 が発生する可能性があります。



    リスト7. mycapture.pdqxmlの構成
    C:\test>java com.ibm.pdq.tools.Configure -pureQueryXml C://mycapture.pdqxml
    -rootPkgName pkg1 -collection coll1

  4. アプリケーションの実行先サーバーにmycapture.pdqxmlをバインドします。

    リスト8. mycapture.pdqxmlをバインドしてDB2パッケージを作成
    C:\test>java com.ibm.pdq.tools.StaticBinder -pureQueryXml C://mycapture.pdqxml -user 
    db2admin -password passw0rd -url jdbc:db2://localhost:50000/demodb

    この時点で、生成時ステップで静的ジェネレーターを使って生成したときには欠けていたSQL文がデータベースにバインドされたはずです。

  5. アプリケーションをふたたび実行するときには、リスト9に示したようにキャプチャーモードをオフにしてください。

    リスト9. キャプチャーをオフにしてアプリケーションを実行
     <!-- PDQ static mode -->                  
     <property name="openjpa.ConnectionProperties"
    value="DriverClassName=com.ibm.db2.jcc.DB2Driver,Url='jdbc:db2://localhost:
    50000/demodb:pdqProperties=executionMode(STATIC),captureMode(off),pureQueryXml
    (c://mycapture.pdqxml);',Username=db2admin,Password=passw0rd" />

  6. オプション。すべてのSQL文が静的に実行されていることを確認するために、リスト10に示すようにpdqProperitesにallowDynamicSQL(false) を追加します。このプロパティをセットすることで、アプリケーションが発行するSQL文でデータベースにバインドされていないものはすべてSQLエラーになります。これは悪意あるSQLインジェクションに対する防御策として有効です。

    リスト10. 動的実行の禁止
     <!-- PDQ static mode -->                  
     <property name="openjpa.ConnectionProperties"
    value="DriverClassName=com.ibm.db2.jcc.DB2Driver,Url='jdbc:db2://local
    host:50000/demodb:pdqProperties=executionMode(STATIC),captureMode(off),
    allowDynamicSQL(false),pureQueryXml(c://mycapture.pdqxml);',Username=db2admin,
    Password=passw0rd" />

管理コンソールからクライアント最適化機能を有効にする

J2EE™ アプリケーションに対しては、WebSphere Application ServerのデータソースのカスタムプロパティpdqPropertiesを設定することで、キャプチャーモードの有効/無効を切り替えることができます。SQL文をファイルにキャプチャーしたら、リスト7とリスト8で説明した通りそれらを構成してバインドすることができ、プロダクション環境でアプリケーションを実行することができます。

  1. WebSphere Application ServerでpdqProperitesを設定するには、リソース => JDBC => データ・ソース を選択します。
  2. アプリケーションが利用するデータ・ソースを選択します。このサンプルではBasicPdqXADataSource を選択して、ダブルクリックします(図14)。

    図14. データ・ソースの選択 (BasicPdqXADataSource)


  3. BasicPdqXADataSource にpdqProperties を追加するには、コンソール(図15)の左側の追加プロパティー => カスタム・プロパティー を選択します。

    図15. BasicPdqXADataSourceにpdqPropertiesを追加


  4. 新規作成 をクリックして、図16に示すようにこれらの値を入力もしくは選択します。
    • 名前: pdqProperties
    • 値: executionMode(DYNAMIC),captureMode(on), pureQueryXml(c://mycapture.pdqxml)
    • タイプ: java.lang.String


    図16 カスタム・プロパティにpdqPropertiesを追加し、動的SQLのキャプチャを有効化


  5. OK をクリックしてこのプロパティーを保存します。このプロパティーを有効にするために、サーバーを再起動します。
  6. この時点で、アプリケーションを実行し、既に説明したとおりキャプチャーファイルの構成とバインドを行います。
  7. パッケージをバインドして、再びアプリケーションを実行する準備が整ったら、図17に示すようにキャプチャーモードをオフにして静的実行を指定します。

    図17. pdqPropertiesのキャプチャーモードをオフにする





上に戻る


まとめ

pureQueryはJavaデータアクセスに対するIBMの新しいパラダイムとして登場しました。pureQueryはツール、ランタイムそしてAPIを提供します。SQLJに対するpureQueryの重要な優位点は、より効率的な方法で静的SQLアクセスを容易に有効化することができることです

この記事ではpureQueryとJPAのシームレスな統合について議論し、DB2サーバーにアクセスするJPAアプリケーションで静的SQLを有効にする二つのアプローチを説明しました。WebSphere Application Server V7の静的ジェネレーターはpureQueryを手っ取り早く使うための手段を提供します。wsdb2genユーティリティーはエンティティクラスを調査し、エンティティクラスから適切なCRUDステートメントと名前付きクエリーに対するSQL文を生成します。一方、pureQueryクライアント最適化機能は実行中のSQL文をアクティブにキャプチャーします。可能なすべてのSQLを生成するよりもむしろ、正常に実行できたもののみをキャプチャーします。理想的には、すべての可能なコードパスを実行する良いテストケースを作成しておくことが必要です。

これらの二つのアプローチは相互補完的なものです。既に述べたとおり、一部のSQLは静的ジェネレーターで生成されません(例えば動的JPQL)。まずwsdb2genを実行してSQL文をバインドし、その後クライアント最適化機能を有効にして、wsdb2genで生成できなかったすべてのSQL文をキャプチャーします。

ぜひ、両方のアプローチを試してみて下さい。





上に戻る


ダウンロード

内容ファイル名サイズダウンロード形式
サンプルアプリケーションJPA_EE_SAMPLE.ear22 KBHTTP
ダウンロード形式について


参考文献

学ぶために

製品や技術を入手するために

議論するために


著者について

Fay Wang は1999年からIBM Silicon Valley Lab に勤務しています。現在は、JPAとpureQueryの統合作業を行っているIBM Object Query Development Teamで働いています。Apache OpenJPA プロジェクトとIBM WebSphereのJPA実装のコントリビューターです。


Catalina Wei はIBM Silicon Valley Labの上級ソフトウェアエンジニアです。現在IBM WebSphere Application ServerのJPA実装を担当しており、Apache OpenJPAプロジェクトのコントリビューターでもあります。以前は、WebSphereのEJB2 Entity Bean実装で使われていたオブジェクトクエリーの実装を担当していました。WeiはDB2のXQuery実装や、XMLからリレーショナル・スキーマへのクエリーやマッピングを研究していたXTables研究プロジェクトの開発者でもあります。


David Wisneski はIBM Silicon Valley LabのObject Query開発チームのマネージャーです。Apache OpenJPAプロジェクトおよびIBM WebSphereのJPA実装のコントリビューターです。Wisneski のIBMでのキャリアはデータベースとシステム運用管理から始まりました。データベース製品の開発に20年間関わっています。University of Colorado, Boulderでコンピューターサイエンスの修士号を取得しています。


Asim Singh はSilicon Valley LabでIBM Data Studioに携わっています。Javaやデータベースアプリケーション開発関連のJavaテクノロジーに精通しています。Asimは仕事上だけでなく、学術的にもJava永続化テクノロジーの経験が豊富です。2~3の例を挙げると、IBM Data Studio pureQuery, JPA, Hibernate, iBatisの経験があります。Asimはリレーショナルデータベーステクノロジーにも造詣が深いです。Asim はUniversity of Wisconsin, Madisonでコンピューターサイエンスの学位を取得し、San Jose State Univでソフトウェアエンジニアリングの修士号を取得しています。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


    日本IBMについて プライバシー お問い合わせ