部署 SQLJ 应用程序
使用“用于 Java™ 企业版的结构化查询语言”(SQLJ) 可开发连接到 DB2®® 数据库的数据访问应用程序。SQLJ 是一组编程扩展,它使您能够使用 Java 编程语言来嵌入提供结构化查询语言 (SQL) 数据库请求的语句。
关于此任务
与可替代 SQLJ 的 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] 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
- 更新应用程序归档,以包括步骤 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 中,导入必要的 SQLJ 包(由 <osgiLibrary> 元素提供):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


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=twlp_deploy_sqlj
文件名:twlp_deploy_sqlj.html