java中對於大量資料採用批量處理來提高效率
阿新 • • 發佈:2019-01-06
設計的話, 是在dao層寫批量新增的方法,以及實現類dao的實現類, 在service呼叫這個dao就可以了! 不過最終走的還是單個只不過是集合的遍歷, 所以不用再mapper.xml裡面配置方法。
IReconBankOrderCpsBatchDao裡面的方法:
public interface IReconBankOrderCpsBatchDao { /** * 儲存多條記錄 * * @param l_eos : 交易對賬-控制表-EO列表 */ void saveAll(List<ReconBankOrderCpsEo> l_eos); /** * 批量更新記錄 * @param l_eos : 交易對賬-控制表-EO列表 */ void batchUpdate(List<ReconBankOrderCpsEo> l_eos); /** * 批量刪除 * @param eos */ void batchDelete(List<ReconBankOrderCpsEo> eos); }
dao的實現類:
@Repository("reconBankOrderCpsBatchDao") public class ReconBankOrderCpsBatchDaoImpl implements IReconBankOrderCpsBatchDao { static Logger logger = LogManager.getLogger(ReconBankOrderCpsBatchDaoImpl.class); @Resource(name = "reconTransBaseSqlSessionTemplate") private SqlSessionTemplate sqlSessionTemplate; @Override public void saveAll(List<ReconBankOrderCpsEo> l_eos) { SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false); IReconBankOrderCpsDao dao = session.getMapper(IReconBankOrderCpsDao.class); int size = l_eos.size(); try { for (int i = 0; i < size; i++) { dao.save(l_eos.get(i)); if (i % 1000 == 0 || i == size - 1) { //手動每1000個一提交,提交後無法回滾 session.commit(); //清理快取,防止溢位 session.clearCache(); } } } catch (Exception e) { logger.error("批量儲存失敗:" ,e); session.rollback(); } finally { session.close(); } } @Override public void batchUpdate(List<ReconBankOrderCpsEo> l_eos) { SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false); IReconBankOrderCpsDao dao = session.getMapper(IReconBankOrderCpsDao.class); int size = l_eos.size(); try { for (int i = 0; i < size; i++) { dao.update(l_eos.get(i)); if (i % 500 == 0 || i == size - 1) { //手動每500個一提交,提交後無法回滾 session.commit(); //清理快取,防止溢位 session.clearCache(); } } } catch (Exception e) { session.rollback(); } finally { session.close(); } } @Override public void batchDelete(List<ReconBankOrderCpsEo> eos) { SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false); IReconBankOrderCpsDao dao = session.getMapper(IReconBankOrderCpsDao.class); int size = eos.size(); try { for (int i = 0; i < size; i++) { dao.delete(eos.get(i).getBankOrderId()); if (i % 1000 == 0 || i == size - 1) { //手動每1000個一提交,提交後無法回滾 session.commit(); //清理快取,防止溢位 session.clearCache(); } } } catch (Exception e) { session.rollback(); } finally { session.close(); } } }
使用的時候只需要在service裡面呼叫dao就可以了。
對於批量新增, 也可以在mapper.xml中配置方法, 實現批量新增。
<!-- 儲存多條記錄 --> <insert id="saveAll" parameterType="java.util.List"> INSERT INTO RECONCAV.T_CBS_RECON_BANKORDER_HANDLE <trim prefix="(" suffix=")" > <include refid="allColumns" /> </trim> SELECT RECONCAV.SEQ_bankorder_hd_tmp.NEXTVAL,RC.* from( <foreach collection="list" item="eo" index="index" separator="union all"> SELECT #{eo.reconId ,jdbcType=VARCHAR}, #{eo.reconDate ,jdbcType=TIMESTAMP}, #{eo.orderDate ,jdbcType=TIMESTAMP}, #{eo.bankTransType ,jdbcType=NUMERIC}, #{eo.bankAcctId ,jdbcType=VARCHAR}, #{eo.productNo ,jdbcType=NUMERIC}, #{eo.bankNo ,jdbcType=NUMERIC}, #{eo.bankName ,jdbcType=VARCHAR}, #{eo.channelNo ,jdbcType=VARCHAR}, #{eo.channelName ,jdbcType=VARCHAR}, #{eo.merchantCode ,jdbcType=VARCHAR}, #{eo.orderAmount ,jdbcType=NUMERIC}, #{eo.cost ,jdbcType=NUMERIC}, #{eo.settleAmount ,jdbcType=NUMERIC}, #{eo.fundsReconStatus ,jdbcType=NUMERIC}, #{eo.aprrovalStatus ,jdbcType=NUMERIC}, #{eo.submitBy ,jdbcType=VARCHAR}, #{eo.submitDetail ,jdbcType=VARCHAR}, #{eo.submitTime ,jdbcType=TIMESTAMP}, #{eo.approvalBy ,jdbcType=VARCHAR}, #{eo.aprrovalDetail ,jdbcType=VARCHAR}, #{eo.aprrovalTime ,jdbcType=TIMESTAMP}, #{eo.memo ,jdbcType=VARCHAR}, #{eo.crtTime ,jdbcType=TIMESTAMP}, #{eo.updTime ,jdbcType=TIMESTAMP}, #{eo.uploadId ,jdbcType=NUMERIC}, #{eo.oraTid ,jdbcType=NUMERIC}, #{eo.idTxn ,jdbcType=VARCHAR}, #{eo.errorTransCode ,jdbcType=VARCHAR}, #{eo.oldTransType ,jdbcType=NUMERIC}, #{eo.accountBankName ,jdbcType=VARCHAR}, #{eo.accountBankFullName ,jdbcType=VARCHAR}, #{eo.payee ,jdbcType=VARCHAR}, #{eo.failReason ,jdbcType=VARCHAR}, #{eo.bankReturnDate ,jdbcType=TIMESTAMP}, #{eo.accountBank ,jdbcType=VARCHAR}, #{eo.traceNo ,jdbcType=VARCHAR} FROM DUAL </foreach> ) RC </insert>