部署 SQLJ 应用程序

使用“用于 Java™ 企业版的结构化查询语言”(SQLJ) 可开发连接到 DB2®® 数据库的数据访问应用程序。SQLJ 是一组编程扩展,它使您能够使用 Java 编程语言来嵌入提供结构化查询语言 (SQL) 数据库请求的语句。

关于此任务

与可替代 SQLJ 的 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] 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 应用程序,请启用必需的功能部件,定义数据源配置,并将必要的共享库应用于应用程序类装入器。必须在 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 中,导入必要的 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
  7. 可以让 WebSphere® Application Server Liberty 随每个合用的连接一起高速缓存 DB2 SQLJ 上下文。DB2 SQLJ 上下文高速缓存可以产生与 WebSphere Application Server 传统版更加一致的行为,例如帮助清理应用程序未关闭的资源。另外,还可以提高 SQLJ 路径上的性能。要启用 DB2 SQLJ 上下文高速缓存,必须将数据源属性 enableConnectionCasting 的值配置为 true 请参阅以下示例:
    <dataSource id="myDS" jndiName="jdbc/myDS" enableConnectionCasting="true">

用于指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: Monday, 5 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=twlp_deploy_sqlj
文件名:twlp_deploy_sqlj.html