1. 程式人生 > >Java中大量資料批量處理方式

Java中大量資料批量處理方式

在訂單中心處理訂單,總會遇到大批量訂單處理的業務,下面就將如何大批量處理資料來提高效率做一個總結;

程式碼設計:在dao層寫批量新增的方法。以及實現dao的實現類,在service呼叫這個dao就可以了,不過最終走的還是單個只不過是集合的遍歷。

IOrderBatchDao

public interface IOrderBatchDao {  
    /** 
     * 儲存多條記錄 
     *  
     * @param orders: 
     */  
    void saveAll(List<Order> orders);  

    /** 
     * 批量更新記錄 
     * @param
orders: */
void batchUpdate(List<Order> orders); /** * 批量刪除 * @param orders */ void batchDelete(List<Order> orders); }

dao的實現類:

@Repository("orderBatchDao ")  
public class OrderBatchDaoImpl implements  
        IOrderBatchDao {  
    static
Logger logger = LogManager.getLogger(OrderBatchDaoImpl .class); @Resource(name = "reconTransBaseSqlSessionTemplate") private SqlSessionTemplate sqlSessionTemplate; @Override public void saveAll(List<Order> orders) { SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false
); IOrderBatchDao dao = session.getMapper(IOrderBatchDao .class); int size = orders.size(); try { for (int i = 0; i < size; i++) { dao.save(orders.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<Order> orders) { SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false); IOrderBatchDao dao = session.getMapper(IOrderBatchDao .class); int size = orders.size(); try { for (int i = 0; i < size; i++) { dao.update(orders.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<Order> orders) { SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false); IOrderBatchDao dao = session.getMapper(IOrderBatchDao .class); int size = orders.size(); try { for (int i = 0; i < size; i++) { dao.delete(orders.get(i).getOrderId()); 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 order(last_name,email,gender,d_id)  
        VALUES   
        <foreach collection="order" item="order" separator=",">  
            (#{order.lastName},#{order.email},#{order.gender},#{order.dept.id})  
        </foreach>  
</insert>