大家知道,Hibernate 有 一级 cache (Session 级) 和二级 cache (需另外配置,如 ehcache),
以下代码,Hibernate 在处理到大约50000条记录时,就会抛出 OutOfMemoryException, 这是因为,Hibernate 把所有新建的 MiniMessage 对象都放在了 Session 级的缓存中了。
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
for(int i=0; i<300000; i++ ) {
System.out.println(i + ".................");
MiniMessage message = new MiniMessage("Hello World" + i);
session.save(message);
}
tx.commit();
} catch (HibernateException he) {
tx.rollback();
throw he;
} finally {
session.close();
}
解决办法:
使用"批处理”(Batch process)
Session session = null;
try {
session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
for(int i=0; i<200000; i++ ) {
log.debug(i + ".................");
MiniMessage message = new MiniMessage("Hello World" + (i+1));
session.save(message);
if ( i % 100 == 0 ) {
//100, same as the JDBC batch size set in xml file:
// <property name="hibernate.jdbc.batch_size">100</property>
//flush a batch of inserts and release memory:
log.debug("fulsh at : " + i + ".................");
session.flush();
session.clear();
}
}
session.getTransaction().commit();
} catch (HibernateException he) {
session.getTransaction().rollback();
throw he;
}
在这种情况下,需要在hibernate.cfg.xml 配置几个参数来达到更好的效果:
1. 配置批处理的大小
<property name="hibernate.jdbc.batch_size">100</property>
2. 放弃二级缓存:
<!-- Disable the second-level cache because the
batch process is one-off process. -->
<property
name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property
name="hibernate.cache.use_second_level_cache">false</property>
<property
name="hibernate.cache.use_query_cache">false</property>
<property
name="hibernate.cache.use_minimal_puts">false</property>
这样,Hibernate 会在每 100 个插入后,与数据库同步一次,并将一级缓存中的实体对象清除。
分享到:
相关推荐
Hibernate 中大量数据的更新 Hibernate 是一个流行的基于 Java 的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在将大量数据插入到数据库时,Hibernate 经常会出现性能和...
在Java开发中,尤其是涉及到大数据量的处理时,人们往往会质疑ORM框架,如Hibernate,是否适合进行批量数据操作。然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。...
Hibernate Shards是Hibernate框架的一个扩展,它提供了数据库分片(Sharding)的功能,帮助解决高并发、大数据量场景下的性能瓶颈。本文将深入探讨Hibernate Shards的原理、使用方法以及其在实际项目中的应用。 一...
- 当处理大量数据或大字段时,如BLOB或CLOB类型,需要注意内存管理和数据库性能。可以使用`lob`类型映射,或者考虑使用游标(Cursor)进行分批处理,以减少内存占用并提高性能。 5. **Hibernate主键生成器(数值型...
这个"java excel大数据量导出demo"提供了一个高效、灵活的解决方案,它支持模板导出,分页查询,以及处理大数据量的能力。在这个项目中,开发者采用了Apache POI库的SXSSFWorkbook子类,这是一个专门为处理大量数据...
Hibernate作为一种强大的对象关系映射(ORM)框架,提供了多种批量处理的方式以提高数据处理效率。批量处理对于需要在短时间内处理大量数据的应用尤其重要,如批量更新、批量插入或批量删除等场景。 #### 二、批量...
2. **Fetch Size和Batch Size**:这两个参数分别控制了每次从数据库读取的数据量和批量处理的数据量,合理设置可以提高效率。 3. **关闭SQL语句打印**:在生产环境中,关闭Hibernate的日志输出可以减少不必要的I/O...
Spring、Hibernate和Atomikos的组合就是一种强大的解决方案,它们可以协同工作以支持多数据源的分布式事务处理。接下来,我们将深入探讨这些技术以及如何配置它们来实现多数据源。 1. **Spring**: Spring是一个...
《深入理解Hibernate4.x及其核心组件》 Hibernate4.x作为Java领域中著名的对象关系映射(ORM)框架,...而深入学习和实践,如利用Hibernate Search实现全文检索,将使开发者在处理大数据量和复杂查询时更加游刃有余。
### Hibernate3性能优化方案 #### 一、抓取优化 抓取优化是针对Hibernate如何高效地处理对象之间的关联关系的一种优化方法。它主要包括两部分:如何抓取和何时抓取。 **1. 如何抓取** 抓取方式分为两种:JOIN...
Struts和Hibernate是Java开发中两个非常重要的框架,它们...这种架构既有利于代码的组织和维护,也能有效地处理高并发和大数据量的场景。开发者通过深入理解和熟练运用这些技术,可以构建出高效、稳定的电子商城平台。
4. 创建MVC应用程序,使用Struts2接收和处理请求,Spring管理业务逻辑,Hibernate处理数据存储。 5. 深入探讨Spring的事务管理,以及如何在Struts2中集成Spring的事务控制。 6. 错误和异常处理,以及如何在Struts2和...
4. **批量处理与Session管理**:使用Hibernate API进行批量处理时,可以通过限制每次处理的数据量来优化。例如,每处理一定数量的对象后,立即调用`session.flush()`和`session.evict()`。这样可以将内存中的对象...
Hibernate是一种Java语言下的对象...Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理SQL和JDBC上的开发时间。
Hibernate作为一个轻量级的Java EE解决方案,广泛应用于各种项目中。 二、初识Hibernate 1. Hibernate环境搭建 要开始使用Hibernate,首先需要下载Hibernate的开发包(如3.6.10版本)以及相关的依赖库,包括Slf4j...
综上所述,"Struts+Spring+Hibernate通用分页解决方案"是一个高效的Java Web开发策略,它充分利用了三大框架的优势,实现了数据的灵活分页,提高了应用的性能和用户体验。通过深入理解并实践这些技术,开发者可以更...
大多数应用程序都需要处理数据。在 Java 应用程序运行过程中,数据通常被封装为相互连接的对象网络。然而,当程序结束时,这些对象会消失,因此需要一种方法来保存这些对象的状态。此外,在编写应用程序之前,数据...
总的来说,"SpringBoot+Hibernate+MySQL+SQLServer双数据源"项目展示了如何在Java环境中灵活处理多数据库的需求,为复杂的企业级应用提供了可靠的解决方案。通过理解并掌握这些技术,开发者可以提升自己的技能,应对...
这种方法的问题在于,每次更新都需要执行一个单独的SQL语句,这不仅消耗了过多的网络资源,而且极大地降低了数据库的性能,尤其是在更新大量数据时。 ### 优化批量更新 为了优化批量更新操作,可以采取以下策略: ...
【hibernate动态分表】是一种数据库设计策略,主要用于处理大数据量的问题,通过将数据分散到多个物理表中,以实现水平扩展,提高查询效率,减轻单表的压力。在Java Web开发中,Hibernate作为一款流行的ORM(对象...