A very simple solution for a queryWithRowHandler when fails due to OutOfMemoryError -----------------------------------------------------------------------------------
Key: IBATIS-474 URL: https://issues.apache.org/jira/browse/IBATIS-474 Project: iBatis for Java Issue Type: Wish Components: DAO Reporter: haruhiko nishi Priority: Trivial A simple solution to queryWithRowHandler gets OutOfMemoryError when it needs to process very large results. Works only if the primary key of the target table is numeric sequence. public void queryWithRowHandler(String id,NumericRange numericRange,RowHandler rowHandler,boolean continueWithError){ DaoException exception=null; boolean retryOccured=false; int retryCount=retry_count; int retryInterval=retry_interval; for(;;){ do{ if(retryOccured||numericRange.hasNextRange()){ try{ daoManager.startTransaction(); super.queryWithRowHandler(id,numericRange,rowHandler); daoManager.commitTransaction(); if(retryOccured){ retryOccured=!retryOccured; retryCount=retry_count; } }catch(DaoException e){ exception=e; retryOccured=true; try{ Thread.sleep(retryInterval * 1000); }catch(InterruptedException ignored){} }finally{ daoManager.endTransaction(); } }else return; }while(retryOccured && (--retryCount>0)); if(retryCount==0){ retryOccured=false; retryCount=retry_count; if(!continueWithError) throw exception; } } } public class NumericRange { private final ReentrantLock mainLock = new ReentrantLock(); private int range; private volatile int max; private volatile int min; private AtomicInteger nextMax; public NumericRange(int range,int max){ if(range<0||max<0) throw new IllegalArgumentException(); this.range=range; this.nextMax=new AtomicInteger(max); } protected final boolean hasNextRange(){ int n,tmpMax; mainLock.lock(); try{ max=nextMax.get(); if((n=max - range -1)> 0) nextMax.set(n); else nextMax.set(0); min=Math.max(0,max-range); return max>0; }finally{ mainLock.unlock(); } } public int getMin(){ return this.min; } public int getMax(){ return this.max; } } <select id="queryWithRowHandler" resultClass="member" parameterClass="NumericRange"> SELECT * FROM TABLE WHERE primary_key BETWEEN #min# and #max# </select> -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.