部署 SQLJ 應用程式
請利用「適用於 Java™ Enterprise Edition 的結構化查詢語言 (SQLJ)」來開發連接 DB2®® 資料庫的資料存取應用程式。 SQLJ 是一組程式設計延伸規格,可讓您利用 Java 程式設計語言來內嵌提供「結構化查詢語言 (SQL)」資料庫要求的陳述式。
關於這項作業
相較於 JDBC 替代方案,在應用程式中使用 SQLJ 會有下列好處︰
- 如果您使用 DB2 自訂和連結步驟,可以改進效能。
- 使應用程式能夠執行靜態 SQL,以便您能夠使用更精細的安全原則(例如 PACKAGE 層次的許可權),而不是 JDBC 提供的動態 SQL。
程序
- 建立 .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(); } } }
- 獲得所需的驅動程式來轉換 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
- 選擇性的: 執行「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 連結完成
- 更新您的應用程式保存檔,使它包含步驟 2 所產生的所有檔案。請務必維護設定檔所在的目錄結構。 比方說,如果 MyDB2SQLJProcedure 類別的完整名稱是 com.company.MyDB2SQLJProcedure,產生的檔案應該在適當應用程式模組的 com/company/ 資料夾中。
註: 自訂的檔案必須放在應用程式類別路徑中的某個位置,且它們必須在 JAR 檔中所未自訂的序列化設定檔前面。 如果您決定取代 JAR 檔中的序列化設定檔,請維護設定檔所在的目錄結構。
- 對於 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>
- 對於 OSGi 應用程式,請啟用 jdbc-4.1 和 wab-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
- 可以讓 WebSphere® Application Server Liberty 利用每一個儲存區連線,來快取 DB2 SQLJ 環境定義。
DB2 SQLJ 環境定義快取可造成與 WebSphere Application Server 傳統版更加一致的行為,例如,有助於清除應用程式所未關閉的資源。
另外,它也可能在 SQLJ 路徑上改進效能。
如果要啟用 DB2 SQLJ 環境定義快取,您必須配置資料來源內容 enableConnectionCasting 的 true 值。 請參閱下列範例:
<dataSource id="myDS" jndiName="jdbc/myDS" enableConnectionCasting="true">
上層主題: 將資料存取應用程式部署到 Liberty

檔名:twlp_deploy_sqlj.html