Hibernate批量插入、更新、刪除
阿新 • • 發佈:2019-02-18
最近一個專案中需要對資料進行統計,然後插入到庫中,資料大概幾萬,一條條搞速度太慢,這就必然要批量插入,一開始
用單執行緒跑,發現速度也不是很快,後面改用多執行緒,速度一下子上來啦,中間遇到幾個問題:
一:就是在批量插入的時候,由於是手動提交事務的,會導致事務提交後不能重新開始,導致後面不能繼續插入資料了,後
面在批量插入方法加上synchronized就OK了。
二:由於統計資料後,是插入到幾個表,一開始是想一個一個表一批一批來批量插入,後面發現不行,只執行最開始的那個
批量操作後面的就不插入了,原因應該是因為事務是手動提交的,具體原因還有待詳查,後面將批量插入的List改成泛型,
hibernate根據物件自動插入到相應的表,貌似這點讓人爽。
批量插入:
/** * 批量插入 * @param entityList * @param size * @create_time 2011-6-9 上午09:27:26 */ public synchronized void batchSave(List<T> entityList,int size){ Transaction transaction=getSession().getTransaction(); Assert.notNull(entityList, "entityList不能為空"); for (int i=0;i< entityList.size();i++) { getSession().saveOrUpdate(entityList.get(i)); if( i %size==0){ getSession().flush(); getSession().clear(); transaction.commit(); transaction=getSession().beginTransaction(); } } transaction.commit(); }
批量修改或刪除
/** * 執行HQL進行批量修改/刪除操作. * * @param values 數量可變的引數,按順序繫結. * @return 更新記錄數. */ public int batchExecute(final String hql, final Object... values) { return createQuery(hql, values).executeUpdate(); } /** * 根據查詢HQL與引數列表建立Query物件. * 與find()函式可進行更加靈活的操作. * * @param values 數量可變的引數,按順序繫結. */ public Query createQuery(final String queryString, final Object... values) { Assert.hasText(queryString, "queryString不能為空"); Query query = getSession().createQuery(queryString); if (values != null) { for (int i = 0; i < values.length; i++) { query.setParameter(i, values[i]); } } return query; }