Skip to content

12. IBM DB2 Express-C 10.5

Przechodzimy teraz do przeniesienia na DB2 tego, co zostało wykonane w przypadku MySQL. Oba SGBD mają bowiem tę samą strategię generowania kluczy głównych.

12.1. Konfiguracja środowiska pracy

12.1.1. Środowisko Eclipse

Będziemy pracować w następującym środowisku Eclipse:

  

Powyższe projekty DB2 znajdują się w folderze [<exemples>/spring-database-config\db2\eclipse].

Uwaga: należy uruchomić polecenie [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.

12.1.2. Generowanie baz danych

Podobnie jak w przypadku Oracle, będziemy musieli zainstalować sterownik JDBC z DB2 w lokalnym repozytorium Maven.

  

Plik [install.bat] zawiera następujący kod:

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

gdzie [%M2-HOME%] to katalog instalacyjny Mavena (patrz punkt 23.2). Po tej instalacji sterownik JDBC z pakietu DB2 można odwołać w plikach [pom.xml] za pomocą następującej zależności:


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

W dalszej części połączenie z bazami danych DB2 odbywa się przy użyciu danych logowania [db2admin / db2admin]. Uruchom DB2 oraz jego klienta [Db2Manager] (patrz punkt 23.8).

  

Baza [DBPROD] jest bazą [dbproduits] poprzedzających ją baz SGBD. Jednak [DB2Manager] nie pozwoliła mi użyć tej nazwy (być może była dla niej zbyt długa). Teraz tworzymy tabelę [PRODUITS] przy użyciu następującej konfiguracji uruchomienia Eclipse dla [generic-create-dbproduits-jpa]:

Operacja ta tworzy tabelę [PRODUITS] w bazie danych [DBPROD]:

  • w przypadku [1], o którym mowa powyżej, sekwencja nie została wygenerowana przez [OpenJpa], lecz przez samą tabelę DB2, która wykorzystuje ją wewnętrznie do generowania kluczy głównych;

Teraz należy wykonać następujące konfiguracje:

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

Wszystkie powinny zakończyć się powodzeniem.

Wygenerujmy teraz bazę [dbproduitscategories]. Z powodów, o których już wspomniano, dotyczących ograniczeń długości nazw baz, nazwiemy ją tutaj [DBCAT]. Powtórz dla [DBCAT] procedurę przeprowadzoną w celu utworzenia [DBPROD].

  

Teraz utworzymy tabele bazy danych [DBCAT] w programie Eclipse, korzystając z konfiguracji [generic-create-dbproduitscategories-openjpa]:

To wykonanie daje następujący wynik:

 

Należy zmodyfikować kolumnę [VERSIONING] we wszystkich pięciu tabelach, tak aby jej wartością domyślną była 1:

 
 

Operację tę należy wykonać dla wszystkich pięciu tabel.

Teraz należy wykonać następujące konfiguracje:

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

Obie konfiguracje powinny zakończyć się powodzeniem.

12.2. Konfiguracja warstwy JDBC

 

Projekt [db2-config-jdbc] konfiguruje warstwę [JDBC] w następującej architekturze testowej:

Projekt ten jest analogiczny do projektu konfiguracyjnego [mysql-config-jdbc] warstwy JDBC w ramach SGBD MySQL (patrz punkt 3.3). Przedstawiamy jedynie zmiany:

Plik [pom.xml] importuje sterownik JDBC z pliku 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>
        <!-- zmienne zależności ********************************************** -->
        <!-- sterownik JDBC dla SGBD -->
        <dependency>
            <groupId>com.ibm.jdbc</groupId>
            <artifactId>db2jcc4</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- stałe zależności ********************************************** -->
....
    </dependencies>

...
</project>
  • wiersze 18–22: sterownik JDBC z pliku DB2;

Druga zmiana dotyczy klasy [ConfigJdbc], która definiuje identyfikatory dostępu do baz danych:


    // parametry połączenia
    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";

Trzecią zmianą, jaką można wprowadzić, jest zmiana maksymalnej liczby parametrów, które może obsługiwać [PreparedStatement]:


    // maksymalna liczba parametrów dla [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;

Test [JUnitTestPushTheLimits] generuje zlecenia SQL dla 5000 produktów, które z kolei wygenerują pliki [PreparedStatement] zawierające 5000 parametrów. MySQL obsłużył tę wartość. Podobnie test DB2.

Czwartą zmianą jest zmiana nazwy tabeli [ROLES]. Nazwa ta jest bowiem zarezerwowana w tabelach SGBD i DB2. Zmieniono ją zatem na [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. Konfiguracja warstwy JPA OpenJpa

 

Projekt [db2-config-jpa-openjpa] konfiguruje warstwę [JPA] architektury testowej:

Projekt ten jest analogiczny do projektu konfiguracyjnego [mysql-config-jpa-openjpa] warstwy JPA, OpenJpa oraz SGBD, MySQL (por. punkt 8.3). Oba projekty SGBD wykorzystują adnotację [@GeneratedValue(strategy = GenerationType.IDENTITY)] do generowania kluczy głównych. Należy wprowadzić tylko jedną zmianę. Znajduje się ona w definicji bean’a [jpaVendorAdapter] klasy [ConfigJpa]:


    // dostawca JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.DB2);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • wiersz 6: informujemy implementację JPA, że będzie ona współpracować z bazą DB2. Implementacja JPA przejmie wówczas zarówno własne typy danych, jak i implementację SQL, która jest właścicielem tej implementacji SGBD.

Po wprowadzeniu tych zmian uruchomienie konfiguracji [spring-jpa-generic-JUnitTestDao-openjpa] powinno zakończyć się powodzeniem.

12.4. Konfiguracja warstwy Hibernate o numerze JPA

 

Uwaga: należy wykonać polecenie [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.

Projekt [db2-config-jpa-hibernate] jest analogiczny do projektu [mysql-config-jpa-hibernate] (punkt 6.3) i zawiera te same modyfikacje, które miały zastosowanie przy przenoszeniu projektu [mysql-config-jpa-openjpa] do projektu [db2-config-jpa-openjpa] (punkt 12.3).

Po wprowadzeniu tych zmian konfiguracja [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] powinna zakończyć się powodzeniem.

 

Uwaga: należy uruchomić [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.

Projekt [db2-config-jpa-eclipselink] jest analogiczny do projektu [mysql-config-jpa-eclipselink] (punkt 7.3) i zawiera te same modyfikacje, które miały zastosowanie przy przenoszeniu projektu [mysql-config-jpa-openjpa] do projektu [db2-config-jpa-openjpa] (punkt 12.3).

Po wprowadzeniu tych zmian konfiguracja [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] powinna zakończyć się powodzeniem.