iBATIS 3 リリース間近で SqlMapClient での処理を書くのも引けてしまうが、
SqlSession でもこれを参考にしようかと思う。
import java.util.ArrayList;
import java.util.List;
import com.ibatis.sqlmap.client.SqlMapClient;
/**
* SqlMapClient バッチ実行キュー処理.
*/
public abstract class SqlOpeCatcher extends QueCatcher<SqlOperation>{
private List<SqlOperation> list;
private SqlMapClient sqlmapclient;
public SqlOpeCatcher(int readMax,long interruptCycle,SqlMapClient sqlmapclient){
super(readMax,interruptCycle);
this.list = new ArrayList<SqlOperation>();
this.sqlmapclient = sqlmapclient;
}
/** 成功時にcall */
public abstract void success();
/** 失敗時にcall */
public abstract void failed();
/* (非 Javadoc)
* @see QueCatcher#interrupt(boolean)
*/
@Override
public QueCatchNext interrupt(boolean isInterruptedExcept){
boolean flg = true;
try{
this.sqlmapclient.startTransaction();
this.sqlmapclient.startBatch();
while(!this.list.isEmpty()){
SqlOperation s = this.list.remove(0);
if (s.obj==null){
if (s.type.equals(SqlOpe.Insert)){
this.sqlmapclient.insert(s.sqlID);
}else if(s.type.equals(SqlOpe.Update)){
this.sqlmapclient.update(s.sqlID);
}else if(s.type.equals(SqlOpe.Delete)){
this.sqlmapclient.delete(s.sqlID);
}
}else{
if (s.type.equals(SqlOpe.Insert)){
this.sqlmapclient.insert(s.sqlID,s.obj);
}else if(s.type.equals(SqlOpe.Update)){
this.sqlmapclient.update(s.sqlID,s.obj);
}else if(s.type.equals(SqlOpe.Delete)){
this.sqlmapclient.delete(s.sqlID,s.obj);
}
}
}
this.sqlmapclient.executeBatch();
this.sqlmapclient.commitTransaction();
}catch(Exception e){
flg = false;
}finally{
try{this.sqlmapclient.endTransaction();}catch(Exception e){}
}
if (flg){
this.success();
}else{
this.failed();
}
return QueCatchNext.CONTINUE;
}
/* (非 Javadoc)
* @see 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 SqlOperation(){}
public SqlOperation(String sqlID,SqlOpe type){
this.sqlID = sqlID;
this.type = type;
this.obj = null;
}
public SqlOperation(String sqlID,SqlOpe type,Object obj){
this.sqlID = sqlID;
this.type = type;
this.obj = obj;
}
@Override
public int compareTo(SqlOperation o){
return 1;
}
}
========================================
public enum SqlOpe{
Insert
,Update
,Delete
}