Skip to content

12. IBM DB2 Express-C 10.5

Passiamo ora al porting su DB2 di quanto è stato fatto con MySQL. I due SGBD hanno infatti la stessa strategia di 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 indicati si trovano nella cartella [<exemples>/spring-database-config\db2\eclipse].

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

12.1.2. Generazione dei database

Come già 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 cartella di installazione di Maven (cfr. paragrafo 23.2). Dopo questa installazione, il driver JDBC di DB2 può essere referenziato nei file [pom.xml] tramite la seguente dipendenza:


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

Da questo momento in poi, la connessione ai database DB2 avviene utilizzando le credenziali [db2admin / db2admin]. Avviare DB2 e il relativo client [Db2Manager] (cfr. paragrafo 23.8).

  

Il database [DBPROD] è il database [dbproduits] dei precedenti SGBD. Ma [DB2Manager] non mi ha permesso di utilizzare questo nome (forse troppo lungo per lui). Ora creiamo la tabella [PRODUITS] con la seguente configurazione di esecuzione Eclipse [generic-create-dbproduits-jpa]:

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

  • in [1], sopra, la sequenza non è stata generata da [OpenJpa] ma proprio da DB2 stesso, che la utilizza internamente per generare 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];

Devono tutte andare a buon fine.

Generiamo ora la base [dbproduitscategories]. Qui verrà denominata [DBCAT] per i motivi già menzionati relativi alla limitazione della lunghezza dei nomi delle basi. Ripetete per [DBCAT] la procedura eseguita per creare [DBPROD].

  

Ora creiamo le tabelle del database [DBCAT] da Eclipse con la configurazione [generic-create-dbproduitscategories-openjpa]:

L'esecuzione produce il seguente risultato:

 

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

 
 

L'operazione va eseguita per tutte e cinque le tabelle.

Ora eseguire le configurazioni:

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

Entrambe devono andare a buon fine.

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] del livello JDBC del SGBD MySQL (cfr. paragrafo 3.3). Riportiamo solo le modifiche:

Il file [pom.xml] importa il driver JDBC da 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>
        <!-- dipendenze variabili ********************************************** -->
        <!-- driver JDBC del SGBD -->
        <dependency>
            <groupId>com.ibm.jdbc</groupId>
            <artifactId>db2jcc4</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- dipendenze costanti ********************************************** -->
....
    </dependencies>

...
</project>
  • righe 18-22: il driver JDBC da DB2;

La seconda modifica riguarda la classe [ConfigJdbc] che definisce gli identificativi di accesso ai database:


    // parametri di connessione
    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:


    // numero massimo di parametri di un [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;

Il test [JUnitTestPushTheLimits] genera ordini SQL su 5000 prodotti che a loro volta genereranno [PreparedStatement] con 5000 parametri. Anche MySQL aveva supportato questo valore. Lo stesso valeva per DB2.

La quarta modifica riguarda il nome della tabella [ROLES]. Infatti, questo nome è già riservato in SGBD e DB2. È stato quindi rinominato [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 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] del livello JPA OpenJpa del SGBD MySQL (cfr. paragrafo 8.3). Infatti, entrambi i SGBD 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] della classe [ConfigJpa]:


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

Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-openjpa] dovrebbe andare a buon fine.

12.4. Configurazione del livello JPA Hibernate

 

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

Il progetto [db2-config-jpa-hibernate] è analogo al progetto [mysql-config-jpa-hibernate] (paragrafo 6.3) con le stesse modifiche che hanno guidato il porting di [mysql-config-jpa-openjpa] al progetto [db2-config-jpa-openjpa] (paragrafo 12.3).

Una volta apportate queste modifiche, l’esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] dovrebbe andare a buon fine.

 

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

Il progetto [db2-config-jpa-eclipselink] è analogo al progetto [mysql-config-jpa-eclipselink] (paragrafo 7.3) con le stesse modifiche che hanno guidato il porting di [mysql-config-jpa-openjpa] al progetto [db2-config-jpa-openjpa] (paragrafo 12.3).

Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] dovrebbe andare a buon fine.