1. 程式人生 > >Hibernate批量插入、更新、刪除

Hibernate批量插入、更新、刪除

最近一個專案中需要對資料進行統計,然後插入到庫中,資料大概幾萬,一條條搞速度太慢,這就必然要批量插入,一開始

用單執行緒跑,發現速度也不是很快,後面改用多執行緒,速度一下子上來啦,中間遇到幾個問題:

一:就是在批量插入的時候,由於是手動提交事務的,會導致事務提交後不能重新開始,導致後面不能繼續插入資料了,後

面在批量插入方法加上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;
	}