SQLJ アプリケーションのデプロイ

Structured Query Language for Java™ Enterprise Edition (SQLJ) を使用して、DB2®® データベースに接続するデータ・アクセス・アプリケーションを開発できます。SQLJ は、Java プログラム言語を使用して Structured Query Language (SQL) データベース要求を実行するステートメントを組み込めるようにする、プログラミングの拡張機能セットです。

このタスクについて

アプリケーションでの SQLJ の使用には、代わりに JDBC を使用する場合に比べて以下のような利点があります。
  • DB2 のカスタマイズおよびバインドのステップを使用する場合、パフォーマンスの向上が期待できます。
  • アプリケーションは静的 SQL を実行できるため、JDBC が提供する動的 SQL に比べて、微細化されたセキュリティー・ポリシー (PACKAGE レベルの許可など) を使用できます。

手順

  1. アプリケーション用にデータベース操作を実行するための .sqlj ファイルを作成します。
    import java.sql.*;
    import javax.sql.*;
    import java.util.*;
    import javax.naming.;
    import sqlj.runtime.*; 
    
    #sql context  MyCtx;
    #sql iterator MyIter(String name);
    public class MyDB2SQLJProcedure
    {   
         public static void myProcedure() throws Exception {
            DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/myDS");
            Connection con = ds.getConnection();       
            con.setAutoCommit(false);
            MyCtx ctx = new MyCtx(con);
            try {
                // Insert some data into the 'mytable' table.
                // Note that the java variables 'key' and 'val' get substituted.   
                int key = 1;            
                String val = "one";
                #sql [ctx] { INSERT into mytable VALUES (:key, :val) };   
                #sql [ctx] { COMMIT };         
                        
                MyIter iter;
                #sql [ctx] iter = { SELECT name FROM mytable WHERE id=1 };           
                iter.next();           
                System.out.println("Found value: " + iter.name());            
                iter.close();     
                #sql [ctx] { COMMIT };
            } finally {
                con.setAutoCommit(true); // When SQLJ performs
          transactional operations during context close, it assumes autocommit is true
                ctx.close();
            }
         }
    }
  2. SQLJ ファイルの変換に必要なドライバーを獲得し、.sqlj ファイルを .java ファイルに変換します。 パラメーター -db2optimize を追加で指定して、DB2 固有の変換を実行することができます (これによってパフォーマンスが向上する可能性があります)。
      java  -cp .:/sqlj/sqlj4.zip:/sqlj/db2jcc4.jar sqlj.tools.Sqlj -C-classpath=/sqlj/sqlj4.zip:/sqlj/db2jcc4.jar 
      -db2optimize MyDB2SQLJProcedure.sqlj
    このコマンドを実行すると、以下の出力ファイルを受け取ります。
    • MyDB2SQLJProcedure.class
    • MyDB2SQLJProcedure.java
    • MyDB2SQLJProcedure_SJProfile0.ser
    • MyDB2SQLJProcedure_SJProfileKeys.class
    • MyCtx.class
    • MyIter.class
  3. オプション: DB2 SQLJ カスタマイザー・ツールを実行して、前に生成された .ser ファイルに対するカスタマイズとバインドを行い、実行時に DB2 で使用されるデータベース内に静的 SQL を作成します。このカスタマイズ・フェーズでは静的 SQL-- を含むデータベース・パッケージを、それぞれの分離レベルごとに 1 つずつ、 計 4 つ作成します。
      java  com.ibm.db2.jcc.sqlj.Customizer -url JDBC_URL -user USER_NAME
      -password  PASSWORD [-rootpkgname PACKAGE_NAME] SERIALIZED_PROFILE1  SERIALIZED_PROFILE2...
    各部の意味は、次のとおりです。
    • JDBC_URL は、テーブルが入っている DB2 システムにアクセスするために使用される JDBC URL であり、構文は jdbc:db2://host-name:port/database-name です。
    • USER_NAME は、テーブルが入っている DB2 システムで有効なユーザー名です
    • PASSWORD は、指定された USER_NAME のパスワードです。
    • PACKAGE_NAME は、7 文字以内の有効な区分データ・セット (PDS) メンバー名です。プロファイル・カスタマイザーにより作成された 4 つの各パッケージは、この名前を使用して開始し、1 から 4 の番号が付加されます。直列化プロファイルを 1 つだけカスタマイズする場合、この値は、直列化プロファイル名の縮小名をデフォルトにとり、-rootpkgname パラメーターは必要としません。同じコマンドで、複数の直列化プロファイルをカスタマイズする場合、 デフォルト値はなく、-rootpkgname パラメーターが必要となります。
    • SERIALIZED_PROFILE# は、カスタマイズしている直列化プロファイルの名前です。
    • 同じコマンドで複数の直列化プロファイルをカスタマイズするには、複数のファイルをスペースで区切ってリストします。
    • また、同じコマンドで複数の直列化プロファイルをカスタマイズする場合、-rootpkgname パラメーターを指定することができます。
    使用例:
      java  -cp .:/sqlj/sqlj4.zip:/sqlj/db2jcc4.jar com.ibm.db2.jcc.sqlj.Customizer
      -url jdbc:db2://localhost:50000/mydb -user dbuser1 -passworddbpass1  MyDB2SQLJProcedure_SJProfile0.ser 
    出力例:
     
      [jcc][sqlj] Begin Customization
      [jcc][sqlj] Loading profile: MyDB2SQLJProcedure_SJProfile0 
      [jcc][sqlj] Customization complete for profile MyDB2SQLJProcedure_SJProfile0.ser
      [jcc][sqlj] Begin Bind
      [jcc][sqlj] Loading profile:MyDB2SQLJProcedure_SJProfile0
      [jcc][sqlj] Driver defaults(user may override): BLOCKING ALL VALIDATE BIND STATICREADONLY YES
      [jcc][sqlj] Fixed driver options: DATETIME ISO DYNAMICRULES BIND
      [jcc][sqlj] Binding package DB2SQL01 atisolation level UR
      [jcc][sqlj] Binding package DB2SQL02 at isolation level CS
      [jcc][sqlj] Binding package DB2SQL03 at isolation level RS 
      [jcc][sqlj] Binding package DB2SQL04 at isolation level RR
      [jcc][sqlj] Bind complete for MyDB2SQLJProcedure_SJProfile0    
  4. アプリケーション・アーカイブを更新して、ステップ 2 で生成されたすべてのファイルを組み込みます。 プロファイルが存在するディレクトリー構造を保持するように注意してください。 例えば、MyDB2SQLJProcedure クラスの完全修飾名が com.company.MyDB2SQLJProcedure である場合、 生成されたファイルは、適切なアプリケーション・モジュールの com/company/ フォルダー内に置かれる必要があります。
    注: カスタマイズしたファイルは、 アプリケーション・クラスパスの一部であるロケーションに配置する必要があり、 また、これらは JAR ファイル内のカスタマイズしていない直列化プロファイルの前に存在している必要があります。 JAR ファイル内の直列化プロファイルを置き換える場合は、 プロファイルが存在するディレクトリー構造を保持してください。
  5. Java EE アプリケーションの場合、必要なフィーチャーを有効にし、 データ・ソース構成を定義し、必要な共有ライブラリーをアプリケーション・クラス・ローダーに適用します。SQLJ を使用するには、 server.xml ファイル内で jdbc-4.1 フィーチャーを有効にする必要があります。JNDI を使用してデータ・ソースが検出される場合、 jndi-1.0 フィーチャーも有効にする必要があります。 以下の例を参照してください。
    <server>
      <featureManager>
        <feature>jdbc-4.1</feature>
        <feature>jndi-1.0</feature> 
      </featureManager>
    
      <application location="myapp.war"> 
         <classloader commonLibraryRef="DB2Lib"/> 
      </application>
    
      <library id="DB2Lib">
        <fileset dir="C:/DB2/java" includes="db2jcc4.jar db2jcc_license_cisuz.jar"/>
      </library>
    
      <dataSource id="myDS" jndiName="jdbc/myDS">
        <jdbcDriver libraryRef="DB2Lib"/>
        <properties.db2.jcc databaseName="mydb" serverName="localhost" portNumber="50000" user="dbuser1"
          password="dbpass1"/> 
      </dataSource>
    </server>
  6. OSGi アプリケーションの場合、OSGi アプリケーションを使用するために jdbc-4.1 および wab-1.0 フィーチャーを有効にします。アプリケーションが JNDI を使用する場合は、 jndi-1.0 フィーチャーも有効にします。SQLJ ライブラリーを参照する <osgiLibrary> を作成します。次に、必要な SQLJ パッケージを含んでいる OSGi ライブラリーを参照するようにアプリケーションを構成します。
    server.xml ファイルの以下の例を参照してください。
    <server>
      <featureManager>
        <feature>jdbc-4.1</feature>
        <feature>jndi-1.0</feature>   
        <feature>wab-1.0</feature> 
      </featureManager>  
    
      <osgiApplication name="myapp" location="myapp.eba"/>
      <osgiLibrary libraryRef="DB2Lib"/>
      <library id="DB2Lib">
        <fileset dir="C:/DB2/java" includes="db2jcc4.jar db2jcc_license_cisuz.jar"/> 
      </library>
    
      <dataSource id="myDS" jndiName="jdbc/myDS">
        <jdbcDriver libraryRef="DB2Lib"/> 
        <properties.db2.jcc databaseName="mydb" serverName="localhost" portNumber="50000" user="dbuser1" password="dbpass1"/> 
       </dataSource>
    </server>
    「myapp」のアプリケーション・モジュールの MANIFEST.MF 内で、<osgiLibrary> エレメントで提供される、必要な SQLJ パッケージをインポートします。
    Import-Package: javax.annotation,
     javax.sql,
     javax.naming,
     com.ibm.db2.jcc,
     com.ibm.db2.jcc.sqlj,
     sqlj.runtime,
     sqlj.runtime.error,
     sqlj.runtime.profile,
     sqlj.runtime.profile.ref,
     sqlj.runtime.profile.util,
     sqlj.runtime.ref,
     sqlj.runtime.util
  7. WebSphere® Application Server Liberty で、プールされた各接続と共に DB2 SQLJ コンテキストをキャッシュに入れるようにすることができます。DB2 SQLJ コンテキストのキャッシングの結果として、アプリケーションによってクローズされないリソースのクリーンアップの支援などの動作で、WebSphere Application Server traditional との整合性が高まる可能性があります。また、SQLJ パスでパフォーマンスが向上する可能性もあります。DB2 SQLJ コンテキスト・キャッシングを有効にするには、データ・ソース・プロパティー enableConnectionCasting を、値を true にして構成します。 以下の例を参照してください。
    <dataSource id="myDS" jndiName="jdbc/myDS" enableConnectionCasting="true">

トピックのタイプを示すアイコン タスク・トピック

ファイル名: twlp_deploy_sqlj.html