Skip to content

12. IBM DB2 Express-C 10.5

اکنون به انتقال کاری که روی MySQL انجام شده به DB2 می‌پردازیم. دو پیکربندی SGBD در واقع از یک استراتژی یکسان برای تولید کلیدهای اصلی استفاده می‌کنند.

12.1. راه‌اندازی محیط کاری

12.1.1. محیط اکلیپس

ما با محیط اکلیپس زیر کار خواهیم کرد:

  

پروژه‌های DB2 که در بالا فهرست شده‌اند، در پوشه [<exemples>/spring-database-config\db2\eclipse] قرار دارند.

توجه: برای بازتولید مجدد تمام پروژه‌های Maven، [Alt-F5] را اجرا کنید.

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] به آن اشاره خواهد شد. رویهٔ به‌کاررفته برای ایجاد [DBPROD] را برای [DBCAT] تکرار کنید.

  

اکنون با استفاده از پیکربندی [generic-create-dbproduitscategories-openjpa]، جداول پایگاه داده [DBCAT] را از اکلیپس ایجاد خواهیم کرد:

این اجرا نتیجه زیر را تولید می‌کند:

 

ستون [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>
  • خطوط ۱۸–۲۲: درایور 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 ایجاد می‌کند که به نوبه خود فایل‌هایی از نوع [PreparedStatement] با ۵۰۰۰ پارامتر تولید خواهند کرد. 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 از anotation [@GeneratedValue(strategy = GenerationType.IDENTITY)] برای تولید کلیدهای اصلی استفاده می‌کنند. فقط یک تغییر باید انجام شود. این تغییر در تعریف bean کلاس [jpaVendorAdapter] است:


    // ارائه‌دهنده JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.DB2);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • خط ۶: به پیاده‌سازی JPA دستور داده شده است که با پایگاه‌دادهٔ DB2 کار کند. پیاده‌سازی JPA سپس هر دو نوع داده‌ی اختصاصی و SQL را که مالک این SGBD است، به کار خواهد گرفت.

پس از اعمال این تغییرات، اجرای پیکربندی [spring-jpa-generic-JUnitTestDao-openjpa] باید با موفقیت انجام شود.

12.4. پیکربندی لایه Hibernate JPA

 

توجه: برای بازتولید مجدد تمام پروژه‌های Maven، [Alt-F5] را اجرا کنید.

پروژه [db2-config-jpa-hibernate] مشابه پروژه [mysql-config-jpa-hibernate] (بخش 6.3) است، با همان اصلاحاتی که هنگام انتقال پروژه [mysql-config-jpa-openjpa] به پروژه [db2-config-jpa-openjpa] انجام شد. (بخش ۱۲.۳).

با اعمال این اصلاحات، اجرای پیکربندی [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] باید با موفقیت انجام شود.

 

توجه: برای بازتولید مجدد تمام پروژه‌های Maven، [Alt-F5] را اجرا کنید.

پروژه [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] باید با موفقیت انجام شود.