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
}>
--------------------------------