Skip to content

12. IBM DB2 Express-C 10.5

Тепер ми переходимо до перенесення на DB2 того, що було зроблено з MySQL. Обидва SGBD, дійсно, мають однакову стратегію генерації первинних ключів.

12.1. Налаштування робочого середовища

12.1.1. Середовище Eclipse

Ми працюватимемо з таким середовищем Eclipse:

  

Вищезазначені проекти DB2 знаходяться у папці [<exemples>/spring-database-config\db2\eclipse].

Примітка: виконайте команду [Alt-F5], щоб перегенерувати всі проекти Maven.

12.1.2. Створення баз даних

Як і у випадку з Oracle, нам потрібно встановити драйвер JDBC з DB2 у локальне сховище Maven.

  

Файл [install.bat] містить такий код:

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

де [%M2-HOME%] — це папка встановлення Maven (див. розділ 23.2). Після цієї інсталяції на драйвер JDBC з DB2 можна посилатися у файлах [pom.xml] за допомогою такої залежності:


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

У подальшому підключення до баз даних DB2 здійснюється за допомогою облікових даних [db2admin / db2admin]. Запустіть DB2 та його клієнт [Db2Manager] (див. параграф 23.8).

  

База [DBPROD] є базою [dbproduits] попередніх SGBD. Але [DB2Manager] не дозволив мені використовувати це ім’я (можливо, воно занадто довге для нього). Тепер ми створюємо таблицю [PRODUITS] із такою конфігурацією виконання в Eclipse: [generic-create-dbproduits-jpa]:

Виконання створює таблицю [PRODUITS] у базі даних [DBPROD]:

  • у [1], наведеному вище, послідовність була згенерована не [OpenJpa], а саме DB2, який використовує її внутрішньо для генерації первинних ключів;

Тепер виконайте налаштування:

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

Усі вони мають виконатися успішно.

Тепер створимо базу [dbproduitscategories]. Тут вона називатиметься [DBCAT] з уже згаданих причин обмеження довжини назв баз. Повторіть для [DBCAT] процедуру, виконану для створення [DBPROD].

  

Тепер ми створюємо таблиці бази даних [DBCAT] у програмі Eclipse, використовуючи конфігурацію [generic-create-dbproduitscategories-openjpa]:

Це виконання дає такий результат:

 

Необхідно змінити стовпець [VERSIONING] у п’яти таблицях, щоб значенням за замовчуванням було 1:

 
 

Цю операцію потрібно виконати для всіх п'яти таблиць.

Тепер виконайте налаштування:

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

Обидві конфігурації мають виконатися успішно.

12.2. Налаштування шару JDBC

 

Проєкт [db2-config-jdbc] налаштовує рівень [JDBC] у такій архітектурі тестування:

Цей проєкт аналогічний проєкту конфігурації [mysql-config-jdbc] для рівня JDBC у ланцюжку SGBD MySQL (див. розділ 3.3). Ми наводимо лише зміни:

Файл [pom.xml] імпортує драйвер JDBC із 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>
        <!-- змінні залежності ********************************************** -->
        <!-- драйвер JDBC для SGBD -->
        <dependency>
            <groupId>com.ibm.jdbc</groupId>
            <artifactId>db2jcc4</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- постійні залежності ********************************************** -->
....
    </dependencies>

...
</project>
  • рядки 18–22: драйвер JDBC з DB2;

Друга зміна стосується класу [ConfigJdbc], який визначає ідентифікатори доступу до баз даних:


    // параметри підключення
    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";

Третя зміна, яку можна внести, стосується максимальної кількості параметрів, які може підтримувати [PreparedStatement]:


    // максимальна кількість параметрів [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;

Тест [JUnitTestPushTheLimits] генерує замовлення SQL на 5000 товарів, які, у свою чергу, генеруватимуть [PreparedStatement] з 5000 параметрами. MySQL також підтримував це значення. DB2 — також.

Четверта зміна стосується назви таблиці [ROLES]. Справа в тому, що ця назва вже зарезервована в SGBD та DB2. Тому її було перейменовано на [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. Налаштування шару JPA OpenJpa

 

Проєкт [db2-config-jpa-openjpa] налаштовує рівень [JPA] тестової архітектури:

Цей проект аналогічний проекту конфігурації [mysql-config-jpa-openjpa] для рівня JPA OpenJpa з SGBD MySQL (див. параграф 8.3). Дійсно, обидва SGBD використовують анотацію [@GeneratedValue(strategy = GenerationType.IDENTITY)] для генерації первинних ключів. Потрібно внести лише одну зміну. Вона знаходиться у визначенні біна [jpaVendorAdapter] класу [ConfigJpa]:


    // провайдер JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.DB2);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • рядок 6: вказуємо реалізації JPA, що вона працюватиме з базою DB2. Реалізація JPA після цього перейме як власні типи даних, так і SQL, що є власником цього SGBD.

Після внесення цих змін виконання конфігурації [spring-jpa-generic-JUnitTestDao-openjpa] має пройти успішно.

12.4. Конфігурація шару JPA Hibernate

 

Примітка: виконайте команду [Alt-F5], щоб перегенерувати всі проекти Maven.

Проєкт [db2-config-jpa-hibernate] аналогічний проєкту [mysql-config-jpa-hibernate] (параграф 6.3) із тими самими змінами, що були застосовані під час перенесення [mysql-config-jpa-openjpa] до проєкту [db2-config-jpa-openjpa] (параграф 12.3).

Після внесення цих змін виконання конфігурації [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] має пройти успішно.

 

Примітка: виконайте [Alt-F5], щоб перегенерувати всі проекти Maven.

Проєкт [db2-config-jpa-eclipselink] аналогічний проєкту [mysql-config-jpa-eclipselink] (параграф 7.3) і містить ті самі зміни, що були застосовані під час перенесення [mysql-config-jpa-openjpa] до проєкту [db2-config-jpa-openjpa] (параграф 12.3).

Після внесення цих змін виконання конфігурації [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] має пройти успішно.