CB3 - チュートリアル 第3章 - 3.4DBアクセス - その3

 3.4.1概要

  • このサンプルの目的
     このアプリケーション作成例を通して、件数を指定した分割コミット(何件ごとにコミットを行うか)の方法を知ることができます。

  • サンプルアプリケーションの内容
     分割コミットを実行して、実行結果を標準出力へ表示するバッチアプリケーションです。  
     サンプルアプリケーションの概要を下図に示します。

     
     
     CB3では、サービス単位で1トランザクションとなります。 大量のデータを扱う場合に分割してコミットを行いたいときは、DBアクセス設定ファイルにコミットの件数を指定します。 DBアクセッサは指定された件数ごとに自動的にコミットを行います。 コミットの件数は、INSERT、UPDATE、DELETEのSQL文単位で指定します。
     
     このサンプルでは以下のファイルについて説明します。  
    • Transaction.java
       サービスのプログラムです。上図内の赤枠の部分に相当します。
    • transactionConfig.xml
       SQL文の設定ファイルです。このファイルに発行するSQL文を記述します。上図内のDBアクセス設定ファイルに相当します。
    • applicationContext.xml
       CB3がserviceContext.xmlなどのspringフレームワーク関連の設定ファイルを読み込むための起点となる コンテキストファイルです。
       このファイルは内容が「3.2DBアクセス - その1」と同じため省略します。
    • serviceContext.xml
       実行対象のサービスを定義します。
    • 起動用バッチファイル - transaction.bat
       サービスを起動するためのバッチファイルです。

 3.4.2サービスの作成

  • Transaction .java

     01: public class Transaction extends CB3Service {
     02:
     03:    /**
     04:     * insert文を発行する。分割コミットが行われていることを確認するため、
     05:     * 4件目のinsert処理で意図的にエラーを発生させている。
     06:     */
     07:    @Override
     08:    protected int doService(ServiceParameters arg0, RuntimeParameters arg1)
     09:            throws ServiceException {
     10:
     11:        DBQueryParameterMap param = new DBQueryParameterMap();
     12:
     13:        //別のコンフィグファイルからアクセッサを生成
     14:        DBAccessor dbaccesor = (DBAccessor)getDataAccessContext().lookup("transactionConfig");
     15:
     16:        //不必要な表データを削除
     17:        dbaccesor.delete("delete");
     18:
     19:        //insertを4回実行、最後の一つで失敗
     20:        param.put("VALUE","insertData1");
     21:        param.put("ID","1");
     22:        dbaccesor.insert("insert",param);
     23:
     24:        param.put("VALUE","insertData2");
     25:        param.put("ID","2");
     26:        dbaccesor.insert("insert",param);
     27:
     28:        param.put("VALUE","insertData3");
     29:        param.put("ID","3");
     30:        dbaccesor.insert("insert",param);
     31:
     32:        System.out.println("エラー行実行: VALUE:insertData4 ID:error");
     33:        param.put("VALUE","insertData4");
     34:        param.put("ID","error");
     35:        dbaccesor.insert("insert",param);
     36:
     37:        return ExitCodeConstant.SUCCESS;
     38:    }
     39:}
    

    20行目〜35行目:
    4件のデータのINSERT処理を行っています。4件目のINSERT処理(33行目〜35行目)は意図的にエラーが発生するようにしています。
    通常(サービス単位で1トランザクション)であればロールバックされるため、データ登録は行われませんが、このサンプルではコミット件数の指定を行っているため2件目(26行目)までの データは登録されます。INSERT処理のSQL設定ファイル(transactionConfig.xml)を見ると、
    <insert id="insert" commitLimitCount="2">
        INSERT INTO tutorial_table VALUES (:ID,:VALUE)
    </insert>
    
    このようになっており、insertタグにcommitLimitCount属性が定義され、件数が指定されています。このサンプルでは設定が2となっているので データを2件INSERTするごとにコミットを行います。このため登録される件数は2件となります。

 3.3.3設定ファイルの作成

  • transactionConfig.xml
    DBアクセス設定ファイルです。サービスで使用するSQL文を定義します。

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:    <!-- 途中省略 -->
     03:    <delete id="delete">
     04:        DELETE  FROM tutorial_table
     05:    </delete>
     06:    <insert id="insert" commitLimitCount="2">
     07:        INSERT INTO tutorial_table VALUES (:ID,:VALUE)
     08:    </insert>
     09:</db-accessor>
    

    6行目:
    insertタグにcommitLimitCountを設定しています。この属性に件数を指定することで、何件ごとにコミットを行うかの設定をすることができます。 commitLimitCountを指定できるタグは、insert、update、deleteです。

  • serviceContext.xml
    このサンプルの実行に必要となるサービスのコンテキストファイルです。

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:    <-- 途中省略 -->
     03:    <!-- ServiceProvider -->
     04:    <bean id="transaction" class="jp.co.cybec.cb3.container.provider.ServiceProviderImpl">
     05:        <property name="service"><ref bean="sample4"/></property>
     06:    </bean>
     07:    <!-- Service -->
     08:    <bean id="sample4" class="jp.co.cybec.cb3.sample.database.transaction.Transaction">
     09:        <property name="dataAccessContext"><ref bean="accessContext"/></property>
     10:    </bean>
     11:    <!-- DataAccessContext -->
     12:    <bean id="accessContext" class="jp.co.cybec.cb3.accessor.DataAccessContextImpl">
     13:          <constructor-arg index="0"><ref bean="testDataAccessors"/></constructor-arg>
     14:    </bean>
     15:    <util:map id="testDataAccessors">
     16:        <entry key="transactionConfig"><ref bean="dbAccessor"/></entry>
     17:    </util:map>
     18:</beans>
    

    3行目〜10行目:
    サービスの定義部分です。

    11行目〜17行目:
    「3.2DBアクセス - その1」で紹介したserviceContext.xmlの内容と同じです。

 3.3.4サービスの実行

  • transaction.bat
     01:@echo off
     02:
     03:setlocal
     04:
     05:call ./set_classpath_com.bat
     06:
     07:set CLASSPATH=%CB3_HOME%/resources/config/transaction;%CLASSPATH%
     08:
     09:java jp.co.cybec.cb3.container.provider.ServiceProviderImpl -ServiceName transaction
     10:
     11:pause
    

    上記バッチファイルを実行すると下記のように表示されます。

    エラー行実行: VALUE:insertData4 ID:error
    続行するには何かキーを押してください . . .
    

    このとき、DB内のデータを確認すると以下のように、2件のデータが登録されています。