最近一个项目中需要对数据进行统计,然后插入到库中,数据大概几万,一条条搞速度太慢,这就必然要批量插入,一开始
用单线程跑,发现速度也不是很快,后面改用多线程,速度一下子上来啦,中间遇到几个问题:
一:就是在批量插入的时候,由于是手动提交事务的,会导致事务提交后不能重新开始,导致后面不能继续插入数据了,后
面在批量插入方法加上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;
}
分享到:
相关推荐
Hibernate+JDBC实现批量插入、更新及删除的方法详解 概述:本文主要介绍了Hibernate+JDBC实现批量插入、更新及删除的方法,通过实例形式详细分析了Hibernate与JDBC针对数据库的批量操作相关实现技巧。 知识点一:...
### HQL批量插入、更新和删除 #### 一、概述 在进行数据库操作时,批量处理数据是一项常见的需求。为了提高效率并减少网络传输开销,HQL(Hibernate Query Language)提供了一种灵活的方式来实现这一目标。HQL是...
然而,在处理大量数据的批量操作时,如批量插入、更新或删除,如果不采取适当的策略,可能会导致性能问题甚至出现内存溢出异常。针对这种情况,Hibernate提供了一些批量处理的解决方案。 批量插入是处理大量数据...
对于更新和删除操作,可以使用`scroll()`方法,这在Hibernate 2.1.6或更高版本中是支持的。`scroll()`方法返回一个`ScrollableResults`对象,允许我们以游标方式处理结果集,这在处理大量数据时非常有效。同样,我们...
因此,本文将详细介绍Hibernate如何高效地进行批量数据处理,包括批量插入、批量更新和批量删除。 #### 二、批量插入 在批量插入数据时,直接使用循环逐一保存的方式容易导致内存溢出。这是因为Hibernate的Session...
批量处理对于需要在短时间内处理大量数据的应用尤其重要,如批量更新、批量插入或批量删除等场景。 #### 二、批量处理的必要性 在实际开发过程中,当需要处理大量数据时,传统的逐条处理方式不仅占用大量的内存...
Hibernate批量插入的常见问题在于,如果一次性保存大量对象,会占用大量内存,可能导致`OutOfMemoryException`,因为默认情况下,Session一级缓存会存储所有待持久化的对象。为了避免这种情况,我们需要定期将缓存...
本文将深入探讨在Hibernate框架下,如何有效地处理大规模数据的批量插入、更新和删除操作。 #### 批量数据插入 传统的Hibernate数据插入方式往往采用单次插入单个实体对象的方式,这在处理小规模数据时效率尚可,...
- 增加:在保存父实体时,可以同时保存其关联的子实体,Hibernate会自动处理子实体的插入操作。对于多对一关系,只需要在父实体中设置子实体的引用即可。 - 查询:可以通过HQL(Hibernate Query Language)或者 ...
- Batch处理:支持批量插入、更新和删除操作,提高大数据量操作的性能。 - Event监听器:允许在特定的持久化操作前后执行自定义逻辑,如事务处理、日志记录等。 - 邮件服务:集成邮件发送功能,实现业务流程中的...
- 批量操作:利用批处理更新或删除,减少数据库交互次数。 -延迟加载(Lazy Loading):只在需要时加载关联对象,避免数据冗余。 8. **HQL和Criteria API**: HQL是面向对象的查询语言,类似于SQL但更接近Java。...
10. **批处理操作**:通过设置批处理大小,Hibernate可以优化批量插入、更新和删除的性能,减少与数据库的交互次数。 11. **JPA支持**:虽然Hibernate最初是一个独立的ORM框架,但在3.5版本中,它也兼容Java ...
标题"浅析Hibernate下数据批量处理方法"和描述中提到,早期的Hibernate在批量插入时可能存在效率问题,但最新版本已经进行了优化,例如通过设置`batch_size`参数来提高批量处理的性能。`batch_size`设置的是JDBC...
为了提高性能,Hibernate提供了批量插入、更新和删除功能,以及延迟加载、批处理等优化策略。合理使用这些特性可以显著提升应用性能。 综上所述,Hibernate中文参考文档详尽地阐述了如何使用Hibernate进行数据持久...
下面将详细介绍HQL在批量删除和批量插入数据方面的知识点。 批量删除数据: 在Hibernate中,如果要批量删除数据,使用Session的delete()方法来删除每一个对象将是非常低效的,尤其是当要删除的对象数量很多时。为此...
2. **批处理**:批量插入、更新和删除数据,减少数据库交互次数。 3. **延迟加载(Lazy Loading)**:只在真正需要时加载关联对象,减少内存消耗。 **六、hibernatePPT** 提供的`hibernatePPT`可能是对Hibernate...
Hibernate支持批量插入和更新操作,这对于处理大量数据非常有用。同时介绍了StatelessSession和Hibernate查询语言(HQL)用于DML操作。 ### 锁机制 Hibernate中的锁机制用来管理并发事务,以确保数据的一致性。文档...
9. 批量操作:为了提高性能,Hibernate支持批量插入、更新和删除,以及批处理查询。 10. JPA集成:Hibernate也实现了Java Persistence API(JPA),提供了一种标准的方式来使用ORM服务。 通过"MLDN_Hibernate开发...
学习者将学习如何执行批量插入、更新和删除,以及如何使用Transaction接口进行事务控制,保证数据的一致性。 通过这个完整的Hibernate框架技术课件,你将能够全面掌握Hibernate的核心功能和最佳实践,从而在实际...