当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:15:00  来源:本站整理

<b>Hibernate下数据批量处理办理策划</b>[Java编程]

赞助商链接



  本文“<b>Hibernate下数据批量处理办理策划</b>[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 .因此,我们在批处理情形下将要禁用用户利用缓存.


  以上是“<b>Hibernate下数据批量处理办理策划</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .