大批量的数据插入到数据库。数量级有万级、十万级、百万级、甚至千万级别的。如此数量级别的数据用Hibernate做插入操作,就可能会发生异常,常见的异常是OutOfMemoryError(内存溢出异常)。
Hibernate插入操作的机制:Hibernate要对它内部缓存进行维护,当我们执行插入操作时,就会把要操作的对象全部放到自身的内部缓存来进行管理。
Hibernate的缓存:Hibernate有内部缓存与二级缓存之说。由于Hibernate对这两种缓存有着不同的管理机制,对于二级缓存,我们可以对它的大小进行相关配置,而对于内部缓存,Hibernate就采取了“放任自流”的态度了,对它的容量并没有限制。现在症结找到了,我们做海量数据插入的时候,生成这么多的对象就会被纳入内部缓存(内部缓存是在内存中做缓存的),这样你的系统内存就会一点一点的被蚕食,如果最后系统被挤“炸”了,也就在情理之中了
处理这个问题两种方法:
1):优化Hibernate,程序上采用分段插入及时清除缓存的方法。
(2):绕过Hibernate API ,直接通过 JDBC API 来做批量插入,这个方法性能上是最 好的,也是最快的。
对于上述中的方法1,其基本是思路为:优化Hibernate,在配置文件中设置hibernate.jdbc.batch_size参数,来指定每次提交SQL的数量;程序上采用分段插入及时清除缓存的方法(Session实现了异步write-behind,它允许Hibernate显式地写操作的批处理),也就是每插入一定量的数据后及时的把它们从内部缓存中清除掉,释放占用的内存。
设置hibernate.jdbc.batch_size参数,可参考如下配置。
<hibernate-configuration>
<session-factory>
.........
<property name=” hibernate.jdbc.batch_size”>50</property>
.........
<session-factory>
<hibernate-configuration>
配置hibernate.jdbc.batch_size参数的原因就是尽量少读数据库,hibernate.jdbc.batch_size参数值越大,读数据库的次数越少,速度越快。从上面的配置可以看出,Hibernate是等到程序积累到了50个SQL之后再批量提交。
笔者也在想,hibernate.jdbc.batch_size参数值也可能不是设置得越大越好,从性能角度上讲还有待商榷。这要考虑实际情况,酌情设置,一般情形设置30、50就可以满足需求了。
程序实现方面,笔者以插入10000条数据为例子,如
Session session=HibernateUtil.currentSession();
Transatcion tx=session.beginTransaction();
for(int i=0;i<10000;i++)
...{
Student st=new Student();
st.setName(“feifei”);
session.save(st);
if(i%50==0) //以每50个数据作为一个处理单元
...{
session.flush(); //保持与数据库数据的同步
session.clear(); //清除内部缓存的全部数据,及时释放出占用的内存
}
}
tx.commit();
分享到:
相关推荐
标题中的"idea工具创建的Spring+SpringMVC+Hibernate+maven项目"指的是使用IntelliJ IDEA这个集成开发环境(IDE)构建的一个Java Web项目,该项目整合了四个关键的技术框架:Spring、SpringMVC、Hibernate以及Maven...
在Flex+Spring+Hibernate的架构中,Hibernate作为数据访问层,负责与数据库之间的交互,为Spring服务层提供数据存储和检索功能。 在该示例中,"bsh"可能是指BeanShell,这是一个小型、轻量级的Java脚本语言,有时在...
Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...
总之,Struts2+Spring+Hibernate的组合提供了强大的企业级应用开发能力,而这个Demo则展示了如何在MyEclipse 8.5环境下进行整合和配置,对于学习和理解SSH框架的集成具有很高的参考价值。通过熟练掌握这种技术栈,...
在现代Java Web开发中,"Maven整合Spring+SpringMVC+Hibernate+SpringDataJPA"是一个常见的架构组合,被广泛应用于构建企业级应用程序。这个组合通常被称为"SSM",其中"M"代表Maven,"S"代表Spring,包括Spring核心...
Webwork、Spring和Hibernate是Java开发中的三大框架,它们各自在不同的层面上为应用程序提供服务。Webwork负责处理用户交互,Spring提供依赖注入和管理事务,而Hibernate则专注于对象关系映射(ORM),使得数据库...
在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别在应用层管理和持久化层处理数据。Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及大量的集成...
8. **异常处理**:整合过程中,可能会遇到 Hibernate 和 Spring 的异常,如 ConstraintViolationException、DataAccessException 等,需要适当地捕获和处理这些异常,提供友好的错误信息。 9. **测试**:编写单元...
在Spring+Hibernate的集成中,Spring可以作为Hibernate的事务管理器,处理事务的开始、提交、回滚等操作。通过SessionFactory和Session接口,Hibernate可以进行对象持久化,将Java对象转换为数据库中的记录。 **...
Struts2、Spring、Hibernate、jQuery 和 JSON 是五个在IT行业中极为重要的技术组件,它们各自在Web应用开发中扮演着不同的角色。这篇文章将详细介绍这些技术的整合使用以及它们的功能。 首先,Struts2 是一个基于 ...
WebWork、Spring和Hibernate是Java开发中的三大框架,它们各自在不同的层面上为应用程序提供服务。WebWork是一个轻量级的MVC(Model-View-Controller)框架,它简化了Web应用的开发,提供了强大的动作调度和数据绑定...
Struts提供了MVC(Model-View-Controller)设计模式的支持,Spring作为一个全面的轻量级框架,提供了依赖注入和AOP(面向切面编程)功能,Hibernate则是用于对象关系映射(ORM)的神器,而MySQL则是一个广泛使用的...
Struts、Spring 和 Hibernate 是Java Web开发中的三大框架,它们的组合通常被称为SSH(Struts、Spring、Hibernate)。这个“struts+spring+hibernate开发 注册小实例”是为初学者设计的一个教程,目的是帮助他们快速...
- **Spring**:是一个轻量级的控制反转(IoC)和面向切面(AOP)容器,用于解决企业应用开发中的各种问题,如依赖注入、事务管理等。 - **Hibernate**:是一个强大的ORM(对象关系映射)框架,用于简化数据库操作,...
4. **Hibernate处理持久层**:在Action中,通过Spring的DAO(Data Access Object)或者Repository,调用Hibernate的API来操作数据库,完成数据的CRUD操作。 5. **结果转发**:业务处理完成后,Struts会根据Action的...
在IT领域,DWR(Direct Web Remoting)、Spring和Hibernate是三个至关重要的技术组件,它们分别在Web应用程序的远程调用、依赖注入和对象关系映射方面发挥着核心作用。将这三个框架整合在一起,可以构建出高效、灵活...
Struts、Spring 和 Hibernate 是Java开发中非常著名的三个开源框架,它们组合在一起形成的SSH(Struts、Spring、Hibernate)框架,是企业级Web应用开发的常用解决方案。SSH框架的整合可以实现模型-视图-控制器(MVC...
Struts2处理请求,Spring管理组件和事务,Hibernate负责数据持久化,而MySql存储数据。EhCache的加入提升了系统的性能,降低了数据库的压力。理解并掌握这些技术,对于开发高效、稳定的Web应用具有重要意义。
在这个场景中,我们关注的是将JavaServer Faces (JSF),Spring,以及Hibernate这三大框架进行整合。这三者分别是用于构建用户界面、管理应用上下文和服务、以及处理持久化的强大工具。以下是对"JSF+Spring+Hibernate...