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
サービスを起動するためのバッチファイルです。
- Transaction.java
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件のデータが登録されています。