這里有個帖子論證HIBERNATE在批量插入時性能下降,以及一些解決方式。
其核心在于批量插入時,積攢一定量后就寫庫,并清除SESSION里的第一級緩存,以免后續插入操作受緩存查找而影響效率:
if ( j % batchNum2 == 0 ) {//執行物理批量插入
session.flush();
session.clear();
}
基于JPA的事務操作,SESSION不可見,此時,需要直接調用EntityManager的flush和clear。
但EntityManager也是被封裝入JpaDaoSupport,實際的EntityManager對象也不容易取得。
此時可以用其JpaTemplate成員的execute方法來實現這兩個操作:
getJpaTemplate().execute(new JpaCallback() {
public Object doInJpa(EntityManager em) throws PersistenceException {
em.flush();
em.clear();
return null;
}
}, true);
在我這里測試結果:
沒有定期調用以上方法時,插入50個記錄要2秒,并且隨著記錄增多,時間越來越長。
每插入50個調用以上方法后,插入50個記錄小于300毫秒,且不隨記錄個數線性增長。
posted on 2009-07-16 21:20
我愛佳娃 閱讀(6713)
評論(0) 編輯 收藏 所屬分類:
Hibernate