知识大全 Hibernate下数据批量处理解决方案

Posted

篇首语:构成我们学习最大障碍的是已知的东西,而不是未知的东西。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Hibernate下数据批量处理解决方案相关的知识,希望对你有一定的参考价值。

Hibernate下数据批量处理解决方案  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  很多人都对Java在批量数据的处理方面是否是其合适的场所持有怀疑的念头 由此延伸 那么就会认为ORM可能也不是特别适合数据的批量处理 其实 我想如果我们应用得当的话 完全可以消除ORM批量处理性能问题这方面的顾虑 下面以Hibernate为例来做为说明 假如我们真的不得不在Java中使用Hibernate来对数据进行批量处理的话 向数据库插入 条数据 用Hibernate可能像这样     Session session = sessionFactory openSession();  Transaction tx = session beginTransaction();  for ( int i= ; i<100000; i++ )   Customer customer = new Customer(.....);  session.save(customer);   mit();  session.close();    大概在运行到第50 000条的时候,就会出现内存溢出而失败。Tw.WiNGwIt.这是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();     mit();  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();   mit(); session.close();    这种做法并不困难,也不算不优雅。请注意,如果Customer启用了second-level caching ,我们仍然会有一些内存管理的问题。原因就是对于用户的每一次插入和更新,Hibernate在事务处理结束后不得不通告second-level cache 。因此,我们在批处理情况下将要禁用用户使用缓存。 cha138/Article/program/Java/ky/201311/28117

相关参考

知识大全 hibernate优化方案

  一批量修改和删除  在Hibernate中如果需要对任何数据进行修改和删除操作都需要先执行查询操作在得到要修改或者删除的数据后再对该数据进行相应的操作处理在数据量少的情况下采用这种处理方式没有问题

知识大全 Spring+Hibernate处理大批量数据

Spring+Hibernate处理大批量数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对

知识大全 Hibernate的批量处理-批量插入

Hibernate的批量处理-批量插入  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hiber

知识大全 Hibernate的批量处理

Hibernate的批量处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hibernate批

知识大全 Hibernate的批量处理[1]

Hibernate的批量处理[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hiberna

知识大全 Hibernate的批量处理[3]

Hibernate的批量处理[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  设置hiber

知识大全 Hibernate的批量处理[2]

Hibernate的批量处理[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  还是用Hibe

知识大全 Hibernate的批量处理[4]

Hibernate的批量处理[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对于方法采用传

知识大全 Hibernate的批量处理[5]

Hibernate的批量处理[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Tra

知识大全 多线程的批量线程同步解决方案

  多线程运行时有待处理线程?试试看下面介绍的这个批量线程同步方法吧  在一批线程处理程序中有时必须等到所有线程全部运行完后才能进行下一步任务处理可以采用如下方法解决创建一个锁对象该锁对象提供一个当前