Skip to content

12. IBM DB2 Express-C 10.5

Ahora abordamos la adaptación a DB2 de lo que se ha hecho con MySQL. De hecho, los dos SGBD tienen la misma estrategia de generación de claves primarias.

12.1. Configuración del entorno de trabajo

12.1.1. Entorno Eclipse

Trabajaremos con el siguiente entorno Eclipse:

  

Los proyectos DB2 mencionados anteriormente se encuentran en la carpeta [<exemples>/spring-database-config\db2\eclipse].

Nota: ejecute [Alt-F5] para regenerar todos los proyectos Maven.

12.1.2. Generación de bases de datos

Al igual que se hizo con Oracle, tendremos que instalar el controlador JDBC de DB2 en el repositorio local de Maven.

  

El archivo [install.bat] contiene el siguiente código:

"%M2_HOME%\bin\mvn.bat" install:install-file -Dfile=db2jcc4.jar -Dpackaging=jar -DgroupId=com.ibm.jdbc -DartifactId=db2jcc4 -Dversion=1.0

donde [%M2-HOME%] es la carpeta de instalación de Maven (véase el apartado 23.2). Tras esta instalación, el controlador JDBC de DB2 puede referenciarse en los archivos [pom.xml] mediante la siguiente dependencia:


        <dependency>
            <groupId>com.ibm.jdbc</groupId>
            <artifactId>db2jcc4</artifactId>
            <version>1.0</version>
</dependency>

A partir de ahora, la conexión a las bases de datos DB2 se realiza con las credenciales [db2admin / db2admin]. Inicie DB2 y su cliente [Db2Manager] (véase el apartado 23.8).

  

La base [DBPROD] es la base [dbproduits] de las anteriores SGBD. Pero [DB2Manager] no me permitió utilizar ese nombre (quizás era demasiado parecido a long para él). Ahora creamos la tabla [PRODUITS] con la siguiente configuración de ejecución de Eclipse [generic-create-dbproduits-jpa]:

La ejecución crea la tabla [PRODUITS] en la base de datos [DBPROD]:

  • en [1], arriba, la secuencia no ha sido generada por [OpenJpa], sino por el propio DB2, que la utiliza internamente para generar claves primarias;

Ahora, ejecute las configuraciones:

  • [spring-jdbc-generic-01.IntroJdbc01];
  • [spring-jdbc-generic-01.IntroJdbc02];
  • [spring-jdbc-generic-03.JUnitTestDao1];
  • [spring-jdbc-generic-03.JUnitTestDao2] ;

Todas deben tener éxito.

Ahora generemos la base [dbproduitscategories]. Aquí se llamará [DBCAT] por las razones ya mencionadas de restricción en la longitud de los nombres de las bases. Repita para [DBCAT] el procedimiento realizado para crear [DBPROD].

  

Ahora creamos las tablas de la base de datos [DBCAT] desde Eclipse con la configuración [generic-create-dbproduitscategories-openjpa]:

Esta ejecución da el siguiente resultado:

 

Es necesario modificar la columna [VERSIONING] de las cinco tablas para que tengan 1 como valor por defecto:

 
 

La operación debe realizarse en las cinco tablas.

Ahora, ejecute las configuraciones:

  • [spring-jdbc-generic-04.JUnitTestDao] ;
  • [spring-jpa-generic-JUnitTestDao-openjpa] ;

Ambas deben completarse con éxito.

12.2. Configuración de la capa JDBC

 

El proyecto [db2-config-jdbc] configura la capa [JDBC] de la siguiente arquitectura de pruebas:

El proyecto es análogo al proyecto de configuración [mysql-config-jdbc] de la capa JDBC del SGBD MySQL (véase el apartado 3.3). Solo presentamos las modificaciones:

El archivo [pom.xml] importa el controlador JDBC de DB2:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>dvp.spring.database</groupId>
    <artifactId>generic-config-jdbc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>configuration generic jdbc</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.3.RELEASE</version>
    </parent>

    <dependencies>
        <!-- dependencias variables ********************************************** -->
        <!-- controlador JDBC del SGBD -->
        <dependency>
            <groupId>com.ibm.jdbc</groupId>
            <artifactId>db2jcc4</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- dependencias constantes ********************************************** -->
....
    </dependencies>

...
</project>
  • líneas 18-22: el controlador JDBC de DB2;

La segunda modificación se encuentra en la clase [ConfigJdbc], que define los identificadores de acceso a las bases de datos:


    // parámetros de conexión
    public final static String DRIVER_CLASSNAME = "com.ibm.db2.jcc.DB2Driver";
    public final static String URL_DBPRODUITS = "jdbc:db2://localhost:50000/dbprod";
    public final static String USER_DBPRODUITS = "db2admin";
    public final static String PASSWD_DBPRODUITS = "db2admin";
    public final static String URL_DBPRODUITSCATEGORIES = "jdbc:db2://localhost:50000/dbcat";
    public final static String USER_DBPRODUITSCATEGORIES = "db2admin";
    public final static String PASSWD_DBPRODUITSCATEGORIES = "db2admin";

La tercera modificación que se puede realizar es la del número máximo de parámetros que un [PreparedStatement] puede admitir:


    // número máximo de parámetros de un [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;

La prueba [JUnitTestPushTheLimits] genera órdenes SQL sobre 5000 productos que generarán [PreparedStatement] con 5000 parámetros. MySQL había soportado este valor. DB2 también.

La cuarta modificación es la del nombre de la tabla [ROLES]. De hecho, este nombre está reservado en SGBD y DB2. Por lo tanto, se ha renombrado como [ROLES_]:


public final static String TAB_ROLES = "ROLES_";
public static final String SELECT_ROLES_BYUSERID = "SELECT DISTINCT r.ID as r_ID, r.VERSIONING as r_VERSIONING, r.NAME as r_NAME FROM ROLES_ r, users u, USERS_ROLES ur"
+ " WHERE u.ID=:id AND ur.USER_ID=u.ID AND ur.ROLE_ID=r.ID";

12.3. Configuración de la capa JPA OpenJpa

 

El proyecto [db2-config-jpa-openjpa] configura la capa [JPA] de la arquitectura de pruebas:

El proyecto es análogo al proyecto de configuración [mysql-config-jpa-openjpa] de la capa JPA OpenJpa del SGBD MySQL (véase el apartado 8.3). De hecho, ambos SGBD utilizan la anotación [@GeneratedValue(strategy = GenerationType.IDENTITY)] para generar las claves primarias. Solo hay que realizar una modificación. Se encuentra en la definición del bean [jpaVendorAdapter] de la clase [ConfigJpa]:


    // el proveedor JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.DB2);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • línea 6: se indica a la implementación JPA que va a trabajar con una base DB2. La implementación JPA adoptará entonces tanto los tipos de datos propietarios como el SQL propietario de este SGBD.

Una vez realizadas estas modificaciones, la ejecución de la configuración [spring-jpa-generic-JUnitTestDao-openjpa] debería completarse con éxito.

12.4. Configuración de la capa JPA de Hibernate

 

Nota: ejecute [Alt-F5] para regenerar todos los proyectos Maven.

El proyecto [db2-config-jpa-hibernate] es análogo al proyecto [mysql-config-jpa-hibernate] (apartado 6.3) con las mismas modificaciones que se aplicaron al portar el [mysql-config-jpa-openjpa] al proyecto [db2-config-jpa-openjpa] (apartado 12.3).

Una vez realizadas estas modificaciones, la ejecución de la configuración [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] debería completarse con éxito.

 

Nota: ejecute [Alt-F5] para regenerar todos los proyectos Maven.

El proyecto [db2-config-jpa-eclipselink] es análogo al proyecto [mysql-config-jpa-eclipselink] (apartado 7.3) con las mismas modificaciones que se aplicaron al traslado del [mysql-config-jpa-openjpa] al proyecto [db2-config-jpa-openjpa] (apartado 12.3).

Una vez realizadas estas modificaciones, la ejecución de la configuración [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] debería completarse con éxito.