最近一个项目中需要对数据进行统计,然后插入到库中,数据大概几万,一条条搞速度太慢,这就必然要批量插入,一开始
用单线程跑,发现速度也不是很快,后面改用多线程,速度一下子上来啦,中间遇到几个问题:
一:就是在批量插入的时候,由于是手动提交事务的,会导致事务提交后不能重新开始,导致后面不能继续插入数据了,后
面在批量插入方法加上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;
}