Despliegue de aplicaciones SQLJ

Utilice Structured Query Language for Java™ Enterprise Edition (SQLJ) para desarrollar aplicaciones de acceso de datos que se conectan a bases de datos DB2®. SQLJ es un conjunto de extensiones de programación que le permite utilizar el lenguaje de programación Java para incorporar declaraciones que proporcionan solicitudes de base de datos SQL (Structured Query Language).

Acerca de esta tarea

El uso de SQLJ en la aplicación proporciona las ventajas siguientes cuando se compara con la alternativa de JDBC:
  • Puede mejorar el rendimiento si utiliza los pasos de personalización y enlace de DB2.
  • Habilite aplicaciones para ejecutar el SQL estático, de forma que puede utilizar políticas de seguridad más precisas, como permisos de nivel PACKAGE, en lugar del SQL que ofrece JDBC.

Procedimiento

  1. Cree un archivo .sqlj para realizar operaciones de base de datos para la aplicación.
    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 {
                // Insertar algunos datos en la tabla 'mytable'.
                // Tenga en cuenta que las variables java 'key' y 'val' se sustituyen.   
                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); // Cuando SQLJ realiza operaciones
          transaccionales durante el cierre del contexto, asume que la confirmación automática es verdadera
                ctx.close();
            }
         }
    }
  2. Adquiera los controladores necesarios para transformar archivos SQLJ y transforme los archivos .sqlj a archivos .java. Puede especificar un parámetro adicional, -db2optimize, para realizar transformaciones específicas de DB2, lo que podría aumentar el rendimiento.
      java  -cp .:/sqlj/sqlj4.zip:/sqlj/db2jcc4.jar
    sqlj.tools.Sqlj -C-classpath=/sqlj/sqlj4.zip:/sqlj/db2jcc4.jar 
      -db2optimize MyDB2SQLJProcedure.sqlj
    Cuando se ejecuta este mandato, se recibe los archivos de salida siguientes:
    • MyDB2SQLJProcedure.class
    • MyDB2SQLJProcedure.java
    • MyDB2SQLJProcedure_SJProfile0.ser
    • MyDB2SQLJProcedure_SJProfileKeys.class
    • MyCtx.class
    • MyIter.class
  3. Opcional: Ejecute la herramienta DB2 SQLJ Customizer para personalizar y enlazar en los archivos .ser generados previamente y cree un SQL estático en la base de datos que utiliza DB2 durante la ejecución. La fase de personalización crea cuatro paquete de base de datos que contienen un SQL-- estático para cada nivel de aislamiento.
      java  com.ibm.db2.jcc.sqlj.Customizer -url JDBC_URL -user USER_NAME
      -password  PASSWORD [-rootpkgname PACKAGE_NAME] SERIALIZED_PROFILE1  SERIALIZED_PROFILE2...
    Donde:
    • JDBC_URL es el URL JDBC que se utiliza para acceder al sistema DB2 donde residen las tablas, con la sintaxis siguiente: jdbc:db2://nombre-host:puerto/nombre-basedatos
    • USER_NAME es un nombre de usuario válido para el sistema DB2 donde residen las tablas.
    • PASSWORD es la contraseña para el USER_NAME especificado
    • PACKAGE_NAME es un nombre de miembro del conjunto de datos particionados (PDS) válido, con una longitud máxima de siete caracteres. Cada uno de los cuatros paquetes creados por el personalizador de perfiles empieza con este nombre y se añaden con un número de 1 a 4. Si solo personaliza un perfil serializado, este valor toma como valor predeterminado una versión abreviada del nombre del perfil serializado y el parámetro -rootpkgname no es necesario. Si personaliza más de un perfil serializado con el mismo mandato, no hay ningún valor predeterminado y el parámetro -rootpkgname es necesario.
    • SERIALIZED_PROFILE# es el nombre del perfil serializado que está personalizando.
    • Para personalizar más de un perfil serializado con el mismo mandato, liste varios archivos separados por espacios.
    • Como alternativa, puede especificar el parámetro -rootpkgname para personalizar más de un perfil serializado con el mismo mandato.
    Ejemplo de uso:
      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 
    Salida de ejemplo:
     
      [jcc][sqlj] Iniciar personalización
      [jcc][sqlj] Cargando perfil: MyDB2SQLJProcedure_SJProfile0 
      [jcc][sqlj] Personalización completa para el perfil MyDB2SQLJProcedure_SJProfile0.ser
      [jcc][sqlj] Empezar enlace
      [jcc][sqlj] Cargando perfil:MyDB2SQLJProcedure_SJProfile0
      [jcc][sqlj] Valores predeterminados de controlador (el usuario
    puede alterar temporalmente): BLOCKING ALL VALIDATE BIND STATICREADONLY YES
      [jcc][sqlj] Opciones de controlador fijadas: DATETIME ISO DYNAMICRULES BIND
      [jcc][sqlj] Enlazando paquete DB2SQL01 en nivel de aislamiento UR
      [jcc][sqlj] Enlazando paquete DB2SQL02 en el nivel de aislamiento CS
      [jcc][sqlj] Enlazando paquete DB2SQL03 en el nivel de aislamiento RS 
      [jcc][sqlj] Enlazando paquete DB2SQL04 en el nivel de aislamiento RR
      [jcc][sqlj] Enlace completo para MyDB2SQLJProcedure_SJProfile0    
  4. Actualice el archivo de aplicación para incluir todos los archivos que se han generado en el paso 2. Asegúrese de mantener la estructura de directorios en la cual existen los perfiles. Por ejemplo, si la clase MyDB2SQLJProcedure tiene un nombre completo de com.company.MyDB2SQLJProcedure, los archivos generados se deberán colocar en una carpeta com/company/ en el módulo de aplicación apropiado.
    Nota: Los archivos personalizados deben colocarse en una ubicación que forme parte de la variable classpath de la aplicación, y deben existir antes que los perfiles serializados del archivo JAR. Si decide sustituir los perfiles serializados del archivo JAR, mantenga la estructura de directorios en la que existen los perfiles.
  5. Para aplicaciones Java EE, habilite las características necesarias, defina una configuración de origen de datos y aplique la biblioteca compartida necesaria al cargador de clases de la aplicación. La característica jdbc-4.1 debe estar habilitada en el archivo server.xml para utilizar SQLJ. Si un origen de datos se encuentra utilizando JNDI, la característica jndi-1.0 también debe estar habilitada. Consulte el ejemplo siguiente:
    <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. Para aplicaciones OSGi, habilite las características jdbc-4.1 y wab-1.0 para utilizar la aplicación OSGi. Si la aplicación utiliza JNDI, habilite también la característica jndi-1.0. Cree una <osgiLibrary> que haga referencia a la biblioteca SQLJ. A continuación, configure la aplicación para que haga referencia a la biblioteca OSGi que contiene los paquetes SQLJ necesarios.
    Consulte el ejemplo siguiente del archivo 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>
    En el MANIFEST.MF del módulo de aplicación para 'myapp', importe los paquetes SQLJ necesarios, que son proporcionados por el elemento <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 puede almacenar en caché el contexto SQLJ de DB2 con cada conexión agrupada. El almacenamiento en memoria caché de contexto DB2 SQLJ puede provocar un comportamiento que sea más coherente con WebSphere Application Server tradicional, como por ejemplo, la limpieza de recursos que no están cerrados por la aplicación. También podría generar mejoras de rendimiento en vías de acceso SQLJ. Para habilitar el almacenamiento en memoria caché de contexto DB2 SQLJ, debe configurar la propiedad de origen de datos enableConnectionCasting con un valor de true. Consulte el ejemplo siguiente:
    <dataSource id="myDS" jndiName="jdbc/myDS"
    enableConnectionCasting="true">

Icono que indica el tipo de tema Tema de tarea

Nombre de archivo: twlp_deploy_sqlj.html