<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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |