Skip to content

12. IBM DB2 Express-C 10.5

ننتقل الآن إلى نقل ما تم تنفيذه في MySQL إلى DB2. فكل من SGBD وMySQL يتبعان نفس استراتيجية إنشاء المفاتيح الأولية.

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] للأسباب التي سبق ذكرها المتعلقة بالقيود المفروضة على طول أسماء قواعد البيانات. كرر الإجراء الذي تم تنفيذه لإنشاء [DBPROD] مع [DBCAT].

  

نقوم الآن بإنشاء جداول قاعدة البيانات [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. تكوين طبقة Hibernate JPA

 

ملاحظة: قم بتنفيذ الأمر [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].