部署 SQLJ 應用程式

請利用「適用於 Java™ Enterprise Edition 的結構化查詢語言 (SQLJ)」來開發連接 DB2®® 資料庫的資料存取應用程式。 SQLJ 是一組程式設計延伸規格,可讓您利用 Java 程式設計語言來內嵌提供「結構化查詢語言 (SQL)」資料庫要求的陳述式。

關於這項作業

相較於 JDBC 替代方案,在應用程式中使用 SQLJ 會有下列好處︰
  • 如果您使用 DB2 自訂和連結步驟,可以改進效能。
  • 使應用程式能夠執行靜態 SQL,以便您能夠使用更精細的安全原則(例如 PACKAGE 層次的許可權),而不是 JDBC 提供的動態 SQL。

程序

  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-- 的資料庫套件,每個隔離層次各一個。
      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 是有效的分割資料集 (PDS) 成員名稱,最多 7 個字元長。 設定檔自訂程式所建立的四個套件,每一個的開頭都是這個名稱,再附加從 1 到 4 的數字。 如果您只自訂一個序列化設定檔,這個值預設為序列化設定檔名稱的縮短版本,且不需要 -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] 開始自訂作業
      [jcc][sqlj] 正在載入設定檔:MyDB2SQLJProcedure_SJProfile0
      [jcc][sqlj] 設定檔 MyDB2SQLJProcedure_SJProfile0.ser 自訂作業完成
      [jcc][sqlj] 開始連結
      [jcc][sqlj] 正在載入設定檔:MyDB2SQLJProcedure_SJProfile0
      [jcc][sqlj] 驅動程式預設值(使用者可以置換):BLOCKING ALL VALIDATE BIND STATICREADONLY YES
      [jcc][sqlj] 固定驅動程式選項:DATETIME ISO DYNAMICRULES BIND
      [jcc][sqlj] 正在連結套件 DB2SQL01,隔離層次 UR
      [jcc][sqlj] 正在連結套件 DB2SQL02,隔離層次 CS
      [jcc][sqlj] 正在連結套件 DB2SQL03,隔離層次 RS
      [jcc][sqlj] 正在連結套件 DB2SQL04,隔離層次 RR
      [jcc][sqlj] MyDB2SQLJProcedure_SJProfile0 連結完成    
  4. 更新您的應用程式保存檔,使它包含步驟 2 所產生的所有檔案。請務必維護設定檔所在的目錄結構。 比方說,如果 MyDB2SQLJProcedure 類別的完整名稱是 com.company.MyDB2SQLJProcedure,產生的檔案應該在適當應用程式模組的 com/company/ 資料夾中。
    註: 自訂的檔案必須放在應用程式類別路徑中的某個位置,且它們必須在 JAR 檔中所未自訂的序列化設定檔前面。 如果您決定取代 JAR 檔中的序列化設定檔,請維護設定檔所在的目錄結構。
  5. 對於 Java EE 應用程式,啟用必要的特性,定義一個資料來源配置,然後將必要的共用程式庫套用於您的應用程式類別載入器。 在 server.xml 檔中,必須啟用 jdbc-4.1 特性,才能使用 SQLJ。 如果利用 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 應用程式,請啟用 jdbc-4.1wab-1.0 特性來使用您的 OSGi 應用程式。 如果您的應用程式使用 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 環境定義快取,您必須配置資料來源內容 enableConnectionCastingtrue 值。 請參閱下列範例:
    <dataSource id="myDS" jndiName="jdbc/myDS" enableConnectionCasting="true">

指示主題類型的圖示 作業主題



「時間戳記」圖示 前次更新: 2016 年 11 月 30 日
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twlp_deploy_sqlj
檔名:twlp_deploy_sqlj.html