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;
	}

猜你喜欢

转载自yaozhiqiang109.iteye.com/blog/1090417