Hibernate下数据批量处理解决方案

解决|数据

很多人都对Java在批量数据的处理方面是否是其合适的场所持有怀疑的念头,由此延伸,那么就会认为ORM可能也不是特别适合数据的批量处理。 其实,我想如果我们应用得当的话,完全可以消除ORM批量处理性能问题这方面的顾虑。下面以Hibernate为例来做为说明,假如我们真的不得不在Java中使用Hibernate来对数据进行批量处理的话。 向数据库插入100 000条数据,用Hibernate可能像这样:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer); }
tx.commit();
session.close();

  大概在运行到第50 000条的时候,就会出现内存溢出而失败。这是Hibernate把最近插入的Customer都以session-level cache在内存做缓存,我们不要忘记Hiberante并没有限制first-level cache 的缓存大小:

  # 持久对象实例被管理在事务结束时,此时Hibernate与数据库同步任何已经发生变 化的被管理的的对象。

  # Session实现了异步write-behind,它允许Hibernate显式地写操作的批处理。 这里,我给出Hibernate如何实现批量插入的方法:
首先,我们设置一个合理的JDBC批处理大小,hibernate.jdbc.batch_size 20。 然后在一定间隔对Session进行flush()和clear()。

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) {
//flush 插入数据和释放内存:
session.flush(); session.clear(); }
}
tx.commit();
session.close();

  那么,关于怎样删除和更新数据呢?那好,在Hibernate2.1.6或者更后版本,scroll() 这个方法将是最好的途径:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers")
.scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while ( customers.next() ) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
if ( ++count % 20 == 0 ) {
//flush 更新数据和释放内存:
session.flush(); session.clear(); } }
tx.commit(); session.close();

  这种做法并不困难,也不算不优雅。请注意,如果Customer启用了second-level caching ,我们仍然会有一些内存管理的问题。原因就是对于用户的每一次插入和更新,Hibernate在事务处理结束后不得不通告second-level cache 。因此,我们在批处理情况下将要禁用用户使用缓存。

时间: 2024-08-03 12:18:38

Hibernate下数据批量处理解决方案的相关文章

Hibernate大数据量操作解决方案

阅读了Hibernate的Reference之后,可以采用批量处理的方法,当插入的数据超过10000时,就flush session并且clear. 下面是一个测试method. 1 /** */ /** 2 * 测试成批插入数据的事务处理,返回是否成功 3 * 4 * @param objPO Object 5 * @return boolean 6 */ 7 public boolean insertBatch( final Object objPO) { 8 boolean isSucce

Hibernate作为数据持久层的分析和研究

数据 摘要 在Java技术中有许多方法可以对数据进行持久化,持久层也是Java应用程序中最重要的部分之一.本文在分析了3种持久层主流解决方案的基础上,介绍了O-R映射开源项目Hibernate,并介绍了在Web应用开发中怎样配置Hibernate的环境,并使用它建立一个应用. 关键字 hibernate,数据持久化,JDBC, EJB,JDO 数据持久层简介 J2EE的三层结构是指表示层(Presentation),业务逻辑层(Business Logic)以及基础架构层(Infrastruct

mysql-Mysql带有longblob类型的表,如何实现大量数据批量插入

问题描述 Mysql带有longblob类型的表,如何实现大量数据批量插入 现在需要大量数据插入Mysql中,使用MySqlDataAdapter的Update速度太慢, 想要通过文件导入,把DataTable转成CSV文件,然后导入. 不过表字段中含有longblob类型的字段,这个应该怎么处理. 或者还有没有什么更好的插入方法? 解决方案 linux下批量插入数据到mysqlMySQL插入大量数据调优如何向mysql中插入大量数据

如何将textbox的多行数据批量添加到数据库中?

问题描述 数据库A的字段为BCDE在textbox中将属性设置为MultiLine,即为多行现在有形如:1122334455667788...的数据,点击提交批量插入到A表中,给点思路和解决的方法,谢谢了. 解决方案 解决方案二:可以用split来折分字符进行数据插入操作解决方案三:可以用listbox,这样更容易插入.解决方案四:有这方面的代码吗?我很急用呀,谢谢了解决方案五:输入格式1,2,3,45,6,7,8可以用split来折分字符进行数据插入操作多行间用rn拆分多条记录,字段间用逗号拆

Hibernate获取数据方式与缓存使用

Hibernate获取数据的方式有不同的几种,其与缓存结合使用的效果也不尽相同,而Hibernate中具体 怎么使用缓存其实是我们很关心的一个问题,直接涉及到性能方面. 缓存在Hibernate中主要有三个方面:一级缓存.二级缓存和查询缓存:一级缓存在Hibernate中对应 的即为session范围的缓存,也就是当session关闭时缓存即被清除,一级缓存在Hibernate中是不可配置 的部分:二级缓存在Hibernate中对应的即为SessionFactory范围的缓存,通常来讲Sessi

hibernate+mysql数据刷新的问题?

问题描述 我的hibernate配置如下<propertyname="connection.url">jdbc:mysql://192.168.10.195:3306/radius?useUnicode=true&characterEncoding=UTF-8</property><propertyname="dialect">org.hibernate.dialect.MySQLDialect</property&

spring-新手关于Spring管理Hibernate下查询性能的疑问

问题描述 新手关于Spring管理Hibernate下查询性能的疑问 我这么两段代码: 1.Query query = Dao.createQuery("from table"); list = query.list(); for(Table item : list){ Query query2 = Dao2.createQuery("select id from table2"); list = query2.list(); } 2.Query query = D

传递用户信息-微信公众平台编辑模式下数据传递问题

问题描述 微信公众平台编辑模式下数据传递问题 现有一已经过认证的微信公众平台运行于编辑模式下.客户需要在自定义菜单中增加一条项目跳转至另一个网站.希望跳转到的那个网站能够了解到用户的信息存入用户数据库.还要能够在用户数据库中选择部分用户给他们发送信息.请问从自定义菜单的链接中跳转过来的用户另一个网站怎么能够获取到可以作为信息回复依据的用户信息. 解决方案 微信只能提供一个作为token的id,但是不提供真实的用户名.腾讯就是这么规定的,起码我也没看到哪个应用能获取到.

[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

原文:[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你! 引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在