`
luoxiaofei126
  • 浏览: 15855 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

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 。因此,我们在批处理情况下将要禁用用户使用缓存。

分享到:
评论

相关推荐

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

    一种解决方法是设置JDBC批处理大小,通过`hibernate.jdbc.batch_size`属性,例如将其设置为20。这意味着每处理20个对象,就会执行一次批处理SQL插入。在代码中,我们需要在适当的时候调用`flush()`和`clear()`方法,...

    Hibernate批量处理

    为了克服这些问题,批量处理成为了一种常见的解决方案。 #### 三、批量处理的实现方式 根据给定的内容,我们可以总结出以下几种批量处理的方法: ##### 1. 通过Session进行批量操作 在使用Session进行批量操作时...

    Hibernate中大量数据的更新

    本文将讨论使用 Hibernate 批量更新大量数据的方法和技巧。 批量更新的必要性 在实际应用中,我们经常需要将大量数据插入到数据库中,例如数据迁移、数据同步、数据备份等场景。在这些场景中,如果使用传统的 ...

    hibernate批量删除

    ### Hibernate批量删除详解 #### 背景与概念 在Java开发中,处理大量数据时,经常需要执行批量操作,如批量更新或批量删除。这些操作对于提高应用程序性能至关重要,尤其是在涉及成千上万条记录的情况下。...

    Hibernate批量处理数据

    ### Hibernate批量处理数据 #### 一、概述 Hibernate作为一款流行的Java持久层框架,它能够以面向对象的方式处理数据库操作,极大地简化了开发过程。然而,在处理大量数据时,如果仍然采用逐条处理的方式,将会...

    Hibernate批量处理海量数据的方法

    以下是针对Hibernate批量处理海量数据的一些关键知识点和优化策略: 1. **理解Hibernate的工作原理**:Hibernate通过查询数据库获取数据,并将其转化为Java对象存储在内存中,这种做法在处理小量数据时非常便捷,但...

    jsp Hibernate批量更新和批量删除处理代码

    ### Hibernate批量更新 Hibernate在执行批量更新操作时,通常会先加载所有符合条件的实体到内存中,然后逐个更新每个实体对象的状态,之后再将这些状态变化同步到数据库中。这会导致大量的内存占用和数据库访问,...

    jsp Hibernate批量更新和批量删除处理代码.docx

    为了解决这些问题,一种改进的方法是使用JDBC API直接执行SQL语句,以减少数据库交互次数。例如,可以直接执行如下SQL来完成批量更新: ```java tx = session.beginTransaction(); Connection con = session....

    java数据批量处理

    4. Spring Batch:Spring框架下的批量处理组件,提供完整的批量处理解决方案,包括分割、读取、处理和写入。 总结,Java数据批量处理涉及到文件读写、数据结构、并行处理、数据库操作、性能优化等多个方面。开发者...

    hibernate批量删除.txt

    为了解决这个问题,可以采用迭代器(`Iterator`)逐条处理数据,减少内存占用。 ```java Transaction tx = session.beginTransaction(); Iterator&lt;Customer&gt; customers = session.createQuery("from Customer c ...

    Java中Hibernate的批量插入

    针对这种情况,Hibernate提供了一些批量处理的解决方案。 批量插入是处理大量数据插入的一种有效方法。通常,初学者可能会尝试一次性创建大量对象并调用Session的save()方法来保存,但这会导致所有对象被存储在...

    Hibernate

    ### Hibernate批量数据处理详解 在IT领域,尤其是企业级应用开发中,Hibernate作为一款流行的ORM(Object Relational Mapping)框架,被广泛应用于Java应用程序中,用于简化数据持久化层的开发工作。然而,当涉及到...

    C#Hibernate数据库海量读写快速存储

    五、远程服务器的挑战与解决方案: 在远程服务器上进行数据库操作,网络延迟会成为性能瓶颈。为优化性能,可以采取以下策略: 1. 数据库复制:设置数据库镜像或读写分离,将读操作分散到多个副本服务器上。 2. 异步...

    hibernate的xml文件bug

    下面将详细探讨可能的问题及解决方案。 首先,XML文件是Hibernate配置的重要组成部分,通常包含`hibernate.cfg.xml`和实体类的`*.hbm.xml`文件。`hibernate.cfg.xml`用于配置数据库连接、事务管理等信息,而`*.hbm....

    Hibernate问题解决

    ### Hibernate问题解决方案 #### 1. 表连接的查询,当表中有外键连接其它表时,如何能一次查出所有的内容? 对于这种情况,可以通过**HQL查询**或**SQL查询**来一次性获取所有相关联的数据。下面详细介绍两种解决...

    Hibernate update问题

    在处理数据更新时,Hibernate提供了多种方法,但同时也可能会遇到一些常见问题。本篇文章将深入探讨Hibernate更新机制及其可能遇到的问题,旨在帮助开发者更好地理解和解决这些问题。 1. **基本更新操作** ...

    hibernate教程打包下载,史上最全的HIBERNATE

    Hibernate是Java中最流行的ORM解决方案之一,它通过XML或注解方式定义映射,使得对象可以直接在数据库中存取。 3. **Hibernate配置**:教程可能详细讲解如何配置Hibernate,包括创建hibernate.cfg.xml文件,设置...

    Hibernate泛型Dao

    泛型Dao的出现,就是为了解决这个问题,它允许开发者通过泛型来定义一个通用的Dao接口,从而减少代码量,提高开发效率。 【描述】"基于hibernate5 泛型Dao实例,下载后改一下数据库配置直接可以用",意味着这个...

Global site tag (gtag.js) - Google Analytics