Skip to content

12. IBM DB2 Express-C 10.5

Wir werden uns nun mit der Portierung der für MySQL durchgeführten Schritte auf DB2 befassen. Beide DBMS verwenden tatsächlich dieselbe Strategie zur Generierung von Primärschlüsseln.

12.1. Einrichten der Arbeitsumgebung

12.1.1. Eclipse-Umgebung

Wir werden mit der folgenden Eclipse-Umgebung arbeiten:

  

Die oben aufgeführten DB2-Projekte befinden sich im Ordner [<examples>/spring-database-config\db2\eclipse].

Hinweis: Drücken Sie [Alt-F5], um alle Maven-Projekte neu zu generieren.

12.1.2. Erstellen der Datenbanken

Wie bei Oracle müssen wir den DB2-JDBC-Treiber im lokalen Maven-Repository installieren.

  

Die Datei [install.bat] enthält den folgenden Code:

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

wobei [%M2-HOME%] das Maven-Installationsverzeichnis ist (siehe Abschnitt 23.2). Nach dieser Installation kann der DB2-JDBC-Treiber in den [pom.xml]-Dateien über die folgende Abhängigkeit referenziert werden:


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

Im weiteren Verlauf dieses Leitfadens werden Verbindungen zu DB2-Datenbanken unter Verwendung der Anmeldedaten [db2admin / db2admin] hergestellt. Starten Sie DB2 und dessen Client [Db2Manager] (siehe Abschnitt 23.8).

  

Die Datenbank [DBPROD] ist die Datenbank [dbproduits] aus dem vorherigen DBMS. Allerdings erlaubte mir [DB2Manager] nicht, diesen Namen zu verwenden (vielleicht, weil er zu lang war). Nun erstellen wir die Tabelle [PRODUITS] mithilfe der folgenden Eclipse-Laufkonfiguration [generic-create-dbproduits-jpa]:

Die Ausführung erstellt die Tabelle [PRODUITS] in der Datenbank [DBPROD]:

  • In [1] oben wurde die Sequenz nicht von [OpenJpa], sondern von DB2 selbst generiert, das sie intern zur Generierung von Primärschlüsseln verwendet;

Führen Sie nun die Konfigurationen aus:

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

Sie sollten alle erfolgreich sein.

Erstellen wir nun die Datenbank [dbproduitscategories]. Sie wird hier aus den bereits erwähnten Gründen bezüglich der Längenbeschränkungen für Datenbanknamen [DBCAT] heißen. Wiederholen Sie für [DBCAT] den Vorgang, den Sie zum Erstellen von [DBPROD] verwendet haben.

  

Wir werden nun die Tabellen für die Datenbank [DBCAT] in Eclipse unter Verwendung der Konfiguration [generic-create-dbproduitscategories-openjpa] erstellen:

Diese Ausführung liefert das folgende Ergebnis:

 

Sie müssen die Spalte [VERSIONING] der fünf Tabellen so ändern, dass sie den Standardwert 1 enthält:

 
 

Dieser Schritt muss für alle fünf Tabellen durchgeführt werden.

Führen Sie nun die Konfigurationen aus:

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

Beide sollten erfolgreich sein.

12.2. Konfigurieren der JDBC-Schicht

 

Das Projekt [db2-config-jdbc] konfiguriert die [JDBC]-Schicht der folgenden Testarchitektur:

Das Projekt entspricht dem Konfigurationsprojekt [mysql-config-jdbc] für die JDBC-Schicht des MySQL-DBMS (siehe Abschnitt 3.3). Wir stellen hier nur die Änderungen vor:

Die Datei [pom.xml] importiert den DB2-JDBC-Treiber:


<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>
  • Zeilen 18–22: der DB2-JDBC-Treiber;

Die zweite Änderung betrifft die Klasse [ConfigJdbc], die die Anmeldedaten für den Datenbankzugriff definiert:


    // 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";

Die dritte Änderung, die vorgenommen werden kann, betrifft die maximale Anzahl von Parametern, die ein [PreparedStatement] unterstützen kann:


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

Der Test [JUnitTestPushTheLimits] generiert SQL-Anweisungen für 5.000 Produkte, wodurch [PreparedStatement]-Objekte mit 5.000 Parametern erzeugt werden. MySQL unterstützte diesen Wert. DB2 ebenfalls.

Die vierte Änderung betrifft den Namen der Tabelle [ROLES]. Dieser Name ist im DB2-DBMS reserviert. Wir haben sie daher in [ROLES_] umbenannt:


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. Konfigurieren der OpenJPA-JPA-Schicht

 

Das Projekt [db2-config-jpa-openjpa] konfiguriert die [JPA]-Schicht der Testarchitektur:

Das Projekt entspricht dem Konfigurationsprojekt [mysql-config-jpa-openjpa] für die OpenJpa-JPA-Schicht des MySQL-DBMS (siehe Abschnitt 8.3). Tatsächlich verwenden beide DBMS die Annotation [@GeneratedValue(strategy = GenerationType.IDENTITY)] zur Generierung von Primärschlüsseln. Es ist nur eine Änderung vorzunehmen. Diese befindet sich in der Definition des [jpaVendorAdapter]-Beans in der [ConfigJpa]-Klasse:


    // the provider JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.DB2);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • Zeile 6: Wir teilen der JPA-Implementierung mit, dass sie mit einer DB2-Datenbank arbeiten wird. Die JPA-Implementierung übernimmt dann sowohl die proprietären Datentypen als auch das proprietäre SQL dieses DBMS.

Nach diesen Änderungen sollte die Ausführung der Konfiguration [spring-jpa-generic-JUnitTestDao-openjpa] erfolgreich sein.

12.4. Konfigurieren der Hibernate-JPA-Schicht

 

Hinweis: Drücken Sie [Alt-F5], um alle Maven-Projekte neu zu generieren.

Das Projekt [db2-config-jpa-hibernate] entspricht dem Projekt [mysql-config-jpa-hibernate] (Abschnitt 6.3) und weist dieselben Anpassungen auf, die bei der Portierung des Projekts [mysql-config-jpa-openjpa] auf das Projekt [db2-config-jpa-openjpa] (Abschnitt 12.3) vorgenommen wurden.

Sobald diese Änderungen vorgenommen wurden, sollte die Ausführung der Konfiguration [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] erfolgreich sein.

 

Hinweis: Drücken Sie [Alt-F5], um alle Maven-Projekte neu zu generieren.

Das Projekt [db2-config-jpa-eclipselink] entspricht dem Projekt [mysql-config-jpa-eclipselink] (Abschnitt 7.3) und weist dieselben Änderungen auf, die bei der Portierung des Projekts [mysql-config-jpa-openjpa] auf das Projekt [db2-config-jpa-openjpa] (Abschnitt 12.3) vorgenommen wurden.

Mit diesen Änderungen sollte die Ausführung der Konfiguration [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] erfolgreich sein.