iBATIS3 更新処理をキューで。。。

iBATIS3 GA版が出てた。
そこで思い立ったのが、、、

iBATIS2 で前はキュー処理化することを考えてた。
http://blog.zaq.ne.jp/oboe2uran/article/321/

ならば、iBATIS3 でも考えてみるべきと思い書いてみた。

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.transaction.Transaction;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import com.google.inject.Inject;
import jp.jsuite.que.QueCatchNext;
import jp.jsuite.que.QueCatcher;

/**
 * iBATIS3 SQL実行キュー処理
 */

public abstract class SqlOpeCatcher3 extends QueCatcher<SqlOperation>{
   private List<SqlOperation> list;
   private SqlSessionFactory sqlsessionFactory;

   /** 成功時にcall */
   public abstract void success();

   /** 失敗時にcall */
   public abstract void failed(Throwable t);

   /**
    * コンストラクタ
    * @param readMax キュー読込みMAX 0を指定すると割込みがかからない限り、
    *    public QueCatchNext interrupt(boolean isInterruptedExcept)が実行されない
    * @param interruptCycle 割込みの周期,ミリ秒
    * @param sqlsessionFactory SqlSessionFactory
    */

   @Inject
   public SqlOpeCatcher3(int readMax,long interruptCycle,SqlSessionFactory sqlsessionFactory){
      super(readMax,interruptCycle);
      this.list = new ArrayList<SqlOperation>();
      this.sqlsessionFactory = sqlsessionFactory;
   }

   /*
    * @see jp.jsuite.que.QueCatcher#interrupt(boolean)
    */

   @Override
   public QueCatchNext interrupt(boolean isInterruptedExcept){
      SqlSession sqlsession = this.sqlsessionFactory.openSession(false);
      TransactionFactory transactionFactory = new JdbcTransactionFactory();
      Transaction tx = transactionFactory.newTransaction(sqlsession.getConnection(),false);

      try{
      while(!this.list.isEmpty()){
         SqlOperation s = this.list.remove(0);
         if (s.obj==null){
            if (s.type.equals(SqlOpe.Insert)){
               sqlsession.insert(s.sqlID);
            }else if(s.type.equals(SqlOpe.Update)){
               sqlsession.update(s.sqlID);
            }else if(s.type.equals(SqlOpe.Delete)){
               sqlsession.delete(s.sqlID);
            }
         }else{
            if (s.type.equals(SqlOpe.Insert)){
               sqlsession.insert(s.sqlID,s.obj);
            }else if(s.type.equals(SqlOpe.Update)){
               sqlsession.update(s.sqlID,s.obj);
            }else if(s.type.equals(SqlOpe.Delete)){
               sqlsession.delete(s.sqlID,s.obj);
            }
         }
      }
      tx.commit();
      this.success();
      }catch(Exception e){
         try{tx.rollback();}catch(SQLException e1){}
         this.failed(e);
      }finally{
         try{tx.close();}catch(SQLException e){}
      }
      return QueCatchNext.CONTINUE;
   }

   /*
    * @see jp.jsuite.que.QueCatcher#read(java.lang.Object)
    */

   @Override
   public QueCatchNext read(SqlOperation s){
      if (s.sqlID==null) return QueCatchNext.END;
      if (s.type != null) this.list.add(s);
      return QueCatchNext.CONTINUE;
   }


}

------------------------------
public class SqlOperation implements Comparable<SqlOperation>{
   public String sqlID;
   public SqlOpe type;
   public Object obj;
    :
}
--------------------------------
public enum SqlOpe{
   Insert
   ,Update
   ,Delete
}>

--------------------------------