Hibernate下数据批量处理

2016-01-29 12:55 6 1 收藏

Hibernate下数据批量处理,Hibernate下数据批量处理

【 tulaoshi.com - Java 】

  很多人都对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 。因此,我们在批处理情况下将要禁用用户使用缓存。
2005年3月29日 2005年3月28日 2005年3月28日 2005年3月28日 2005年3月28日 2005年3月28日 2005年3月27日 2005年3月27日 2005年3月27日 2005年3月26日 2005年3月26日 2005年3月26日

来源:https://www.tulaoshi.com/n/20160129/1488132.html

延伸阅读
幸运的是,MySQL提供了一些方法用于批量录入数据,使得向表中添加数据变得容易了。本节以及下一节,将介绍这些方法。本节将介绍SQL语言级的解决方法。 1、基本语法 语法:LOAD DATA [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name LOAD DATA INFILE语句从一个文本文件中以很高的速度读入一个表中。如果指定LOCAL关键...
标签: excel
Excel如何批量录入相同数据   操作步骤 第一步、选取需要录入相同数据的单元格区域; 第二步、在保持单元格区域被选取的状态下,直接录入数据,这是您会发现,最后一个被选取的单元格可以处于编辑状态; 第三步、数据录入完毕后,按住Ctrl+Enter,所有被选取的单元格均被刚才录入的数据所填充。 注意事项 ...
hibernate.cfg.xml加上属性. property name="connection.useUnicode"true/property property name="connection.characterEncoding"UTF-8/property mysql 的驱动用3.0.15以上版本的, 加个Filter, 使用UTF-8字符集就可以了, 若使用Spring则写在spring中的sessionFactory里即可。 例如: ?xml version='1.0' encoding='UTF-8'? !DOCTYPE hi...
标签: ASP
  批量录入在数据库的应用中比较广泛的,关于批量录入的方法也有好多种。 下面我就结合我实际中的应用,谈一下儿我是怎么实现的。 主要用到的是form的集合的概念,通过循环取的所有的集合内数据。 考虑到大家看着方便,我把它集成到了一个页面。 下面是具体的代码: batchInput.asp <% '##################################### 'File F...
标签: 软件教程
强大的美图秀秀有着众多的功能,在我们处理图片的过程中有些时候很多图片只需要的做一个动作,一张一张太麻烦。其实我们可以用的美图秀秀的批处理功能,下面小编就为大家介绍一下美图秀秀批处理功能怎么用 在主页面,我们可以看到批量处理的选项,点击此选项 左边选择照片上传 打开需要处理的照片 打...

经验教程

60

收藏

99
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部