`
hance1000000
  • 浏览: 57673 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在Spring+hibernate下遇到了处理大数据量的问题

阅读更多
    大批量的数据插入到数据库。数量级有万级、十万级、百万级、甚至千万级别的。如此数量级别的数据用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();

分享到:
评论
2 楼 greemranqq 2014-04-11  
peak 写道
最好加入多线程操作,同时开几个线程,一起整,效果好的很


这个多线程会提速吗?和数据库的关系影响大不?
1 楼 peak 2014-04-11  
最好加入多线程操作,同时开几个线程,一起整,效果好的很

相关推荐

    idea工具创建的Spring+SpringMVC+Hibernate+maven项目

    标题中的"idea工具创建的Spring+SpringMVC+Hibernate+maven项目"指的是使用IntelliJ IDEA这个集成开发环境(IDE)构建的一个Java Web项目,该项目整合了四个关键的技术框架:Spring、SpringMVC、Hibernate以及Maven...

    Flex+spring+hibernate示例

    在Flex+Spring+Hibernate的架构中,Hibernate作为数据访问层,负责与数据库之间的交互,为Spring服务层提供数据存储和检索功能。 在该示例中,"bsh"可能是指BeanShell,这是一个小型、轻量级的Java脚本语言,有时在...

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...

    struts2+spring+hibernate Demo

    总之,Struts2+Spring+Hibernate的组合提供了强大的企业级应用开发能力,而这个Demo则展示了如何在MyEclipse 8.5环境下进行整合和配置,对于学习和理解SSH框架的集成具有很高的参考价值。通过熟练掌握这种技术栈,...

    Maven整合Spring+SpringMVC+Hibernate+SpringDataJPA

    在现代Java Web开发中,"Maven整合Spring+SpringMVC+Hibernate+SpringDataJPA"是一个常见的架构组合,被广泛应用于构建企业级应用程序。这个组合通常被称为"SSM",其中"M"代表Maven,"S"代表Spring,包括Spring核心...

    Webwork+spring+hibernate集成实例

    Webwork、Spring和Hibernate是Java开发中的三大框架,它们各自在不同的层面上为应用程序提供服务。Webwork负责处理用户交互,Spring提供依赖注入和管理事务,而Hibernate则专注于对象关系映射(ORM),使得数据库...

    spring+hibernate整合demo

    在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别在应用层管理和持久化层处理数据。Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及大量的集成...

    Spring+hibernate整合源代码

    8. **异常处理**:整合过程中,可能会遇到 Hibernate 和 Spring 的异常,如 ConstraintViolationException、DataAccessException 等,需要适当地捕获和处理这些异常,提供友好的错误信息。 9. **测试**:编写单元...

    Spring+Hibernate+MySql的应用实例

    在Spring+Hibernate的集成中,Spring可以作为Hibernate的事务管理器,处理事务的开始、提交、回滚等操作。通过SessionFactory和Session接口,Hibernate可以进行对象持久化,将Java对象转换为数据库中的记录。 **...

    struts2+spring+hibernate+jquery+json

    Struts2、Spring、Hibernate、jQuery 和 JSON 是五个在IT行业中极为重要的技术组件,它们各自在Web应用开发中扮演着不同的角色。这篇文章将详细介绍这些技术的整合使用以及它们的功能。 首先,Struts2 是一个基于 ...

    webwork+spring+hibernate 开发资料

    WebWork、Spring和Hibernate是Java开发中的三大框架,它们各自在不同的层面上为应用程序提供服务。WebWork是一个轻量级的MVC(Model-View-Controller)框架,它简化了Web应用的开发,提供了强大的动作调度和数据绑定...

    Struts+Spring+Hibernate+MySQL

    Struts提供了MVC(Model-View-Controller)设计模式的支持,Spring作为一个全面的轻量级框架,提供了依赖注入和AOP(面向切面编程)功能,Hibernate则是用于对象关系映射(ORM)的神器,而MySQL则是一个广泛使用的...

    struts+spring+hibernate开发 注册小实例

    Struts、Spring 和 Hibernate 是Java Web开发中的三大框架,它们的组合通常被称为SSH(Struts、Spring、Hibernate)。这个“struts+spring+hibernate开发 注册小实例”是为初学者设计的一个教程,目的是帮助他们快速...

    Struts+Spring+Hibernate框架搭建

    - **Spring**:是一个轻量级的控制反转(IoC)和面向切面(AOP)容器,用于解决企业应用开发中的各种问题,如依赖注入、事务管理等。 - **Hibernate**:是一个强大的ORM(对象关系映射)框架,用于简化数据库操作,...

    spring+hibernate+struts

    4. **Hibernate处理持久层**:在Action中,通过Spring的DAO(Data Access Object)或者Repository,调用Hibernate的API来操作数据库,完成数据的CRUD操作。 5. **结果转发**:业务处理完成后,Struts会根据Action的...

    dwr+spring+hibernate模板.zip

    在IT领域,DWR(Direct Web Remoting)、Spring和Hibernate是三个至关重要的技术组件,它们分别在Web应用程序的远程调用、依赖注入和对象关系映射方面发挥着核心作用。将这三个框架整合在一起,可以构建出高效、灵活...

    struts+spring+hibernate

    Struts、Spring 和 Hibernate 是Java开发中非常著名的三个开源框架,它们组合在一起形成的SSH(Struts、Spring、Hibernate)框架,是企业级Web应用开发的常用解决方案。SSH框架的整合可以实现模型-视图-控制器(MVC...

    基于Struts2+Spring+Hibernate+MySql的注册登录系统.zip

    Struts2处理请求,Spring管理组件和事务,Hibernate负责数据持久化,而MySql存储数据。EhCache的加入提升了系统的性能,降低了数据库的压力。理解并掌握这些技术,对于开发高效、稳定的Web应用具有重要意义。

    JSF+Spring+Hibernate(框架整合)详细过程

    在这个场景中,我们关注的是将JavaServer Faces (JSF),Spring,以及Hibernate这三大框架进行整合。这三者分别是用于构建用户界面、管理应用上下文和服务、以及处理持久化的强大工具。以下是对"JSF+Spring+Hibernate...

Global site tag (gtag.js) - Google Analytics