Skip to content

12. IBM DB2 Express-C 10.5

Affronteremo ora il porting su DB2 di quanto fatto con MySQL. Entrambi i DBMS utilizzano infatti la stessa strategia per la generazione delle chiavi primarie.

12.1. Configurazione dell'ambiente di lavoro

12.1.1. Ambiente Eclipse

Lavoreremo con il seguente ambiente Eclipse:

  

I progetti DB2 sopra elencati si trovano nella cartella [<examples>/spring-database-config\db2\eclipse].

Nota: premere [Alt-F5] per rigenerare tutti i progetti Maven.

12.1.2. Generazione dei database

Come abbiamo fatto con Oracle, dovremo installare il driver JDBC di DB2 nel repository Maven locale.

  

Il file [install.bat] contiene il seguente codice:

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

dove [%M2-HOME%] è la directory di installazione di Maven (vedere la sezione 23.2). Dopo questa installazione, è possibile fare riferimento al driver JDBC DB2 nei file [pom.xml] utilizzando la seguente dipendenza:


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

Nel resto di questa guida, le connessioni ai database DB2 vengono effettuate utilizzando le credenziali [db2admin / db2admin]. Avviare DB2 e il suo client [Db2Manager] (vedere la sezione 23.8).

  

Il database [DBPROD] corrisponde al database [dbproduits] del precedente DBMS. Tuttavia, [DB2Manager] non mi ha permesso di utilizzare quel nome (forse perché era troppo lungo). Ora creiamo la tabella [PRODUITS] utilizzando la seguente configurazione di esecuzione di Eclipse [generic-create-dbproduits-jpa]:

L'esecuzione crea la tabella [PRODUITS] nel database [DBPROD]:

  • nel punto [1] sopra, la sequenza non è stata generata da [OpenJpa] ma dallo stesso DB2, che la utilizza internamente per generare le chiavi primarie;

Ora, esegui le configurazioni:

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

Dovrebbero superare tutti i test.

Ora generiamo il database [dbproduitscategories]. Qui verrà chiamato [DBCAT] per i motivi già menzionati riguardo alle restrizioni sulla lunghezza del nome del database. Ripetere la procedura utilizzata per creare [DBPROD] per [DBCAT].

  

Ora creeremo le tabelle per il database [DBCAT] da Eclipse utilizzando la configurazione [generic-create-dbproduitscategories-openjpa]:

L'esecuzione produce il seguente risultato:

 

È necessario modificare la colonna [VERSIONING] delle cinque tabelle in modo che il valore predefinito sia 1:

 
 

Questo passaggio deve essere eseguito per tutte e cinque le tabelle.

Ora, esegui le configurazioni:

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

Entrambe dovrebbero superare il test.

12.2. Configurazione del livello JDBC

 

Il progetto [db2-config-jdbc] configura il livello [JDBC] della seguente architettura di test:

Il progetto è analogo al progetto di configurazione [mysql-config-jdbc] per il livello JDBC del DBMS MySQL (vedi Sezione 3.3). Riportiamo solo le modifiche:

Il file [pom.xml] importa il driver JDBC di 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>
        <!-- dépendances variables ********************************************** -->
        <!-- driver JDBC from SGBD -->
        <dependency>
            <groupId>com.ibm.jdbc</groupId>
            <artifactId>db2jcc4</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- dépendances constantes ********************************************** -->
....
    </dependencies>
 
...
</project>
  • righe 18-22: il driver JDBC di DB2;

La seconda modifica riguarda la classe [ConfigJdbc], che definisce le credenziali di accesso al database:


    // paramètres de connexion
    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 terza modifica che è possibile apportare riguarda il numero massimo di parametri che un [PreparedStatement] può supportare:


    // max number of parameters of a [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;

Il test [JUnitTestPushTheLimits] genera istruzioni SQL per 5.000 prodotti, il che comporta la creazione di oggetti [PreparedStatement] con 5.000 parametri. MySQL ha supportato questo valore. Lo stesso vale per DB2.

La quarta modifica riguarda il nome della tabella [ROLES]. Questo nome è riservato nel DBMS DB2. Abbiamo quindi rinominato la tabella [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. Configurazione del livello JPA di OpenJPA

 

Il progetto [db2-config-jpa-openjpa] configura il livello [JPA] dell'architettura di test:

Il progetto è analogo al progetto di configurazione [mysql-config-jpa-openjpa] per il livello JPA OpenJpa del DBMS MySQL (vedere la Sezione 8.3). Infatti, entrambi i DBMS utilizzano l'annotazione [@GeneratedValue(strategy = GenerationType.IDENTITY)] per generare le chiavi primarie. C'è solo una modifica da apportare. Si trova nella definizione del bean [jpaVendorAdapter] nella classe [ConfigJpa]:


    // the provider JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.DB2);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • Riga 6: Indichiamo all'implementazione JPA che lavorerà con un database DB2. L'implementazione JPA adotterà quindi sia i tipi di dati proprietari che l'SQL proprietario di questo DBMS.

Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-openjpa] dovrebbe avere esito positivo.

12.4. Configurazione del livello JPA di Hibernate

 

Nota: premere [Alt-F5] per rigenerare tutti i progetti Maven.

Il progetto [db2-config-jpa-hibernate] è analogo al progetto [mysql-config-jpa-hibernate] (Sezione 6.3) e presenta le stesse modifiche utilizzate per il porting del progetto [mysql-config-jpa-openjpa] al progetto [db2-config-jpa-openjpa] (Sezione 12.3).

Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] dovrebbe avere esito positivo.

 

Nota: premere [Alt-F5] per rigenerare tutti i progetti Maven.

Il progetto [db2-config-jpa-eclipselink] è analogo al progetto [mysql-config-jpa-eclipselink] (Sezione 7.3) con le stesse modifiche utilizzate per portare il progetto [mysql-config-jpa-openjpa] al progetto [db2-config-jpa-openjpa] (Sezione 12.3).

Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] dovrebbe avere esito positivo.