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































