`
caoxiping
  • 浏览: 30860 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate批处理

阅读更多
在一般情况下,使用hibernate将500000条记录插入到数据库中,通常的做法是:

Java代码
Session session = sessionFactory.openSession();  
 
Transaction tran = session.beginTransaction();  
 
for(int i =0;i<500000;i++){  
  Customer custmoer = new Custormer(....);  
 
  session.save(custmoer);  
}  
 
tran.commit();  
 
session.close(); 

Session session = sessionFactory.openSession();

Transaction tran = session.beginTransaction();

for(int i =0;i<500000;i++){
  Customer custmoer = new Custormer(....);

  session.save(custmoer);
}

tran.commit();

session.close();


通常执行结果会抛出内存溢出异常(OutOfMemoryException).

原因是因为实例在session级别的缓存区进行了缓存的缘故;

解决方法使用JDBC的批量(Batching)功能。使用JDBC的批量抓取数量(Batch Size)参数设置到一个合适值;

hibernate.jdbc.batch_size 20

如果要将很多对象持久化,必须经常flush()以及使用clear()来控制一级缓存的大小。如下

Java代码
Session session = sessionFactory.openSession();  
 
Transaction tran = session.beginTransaction();  
 
for(int i =0;i<500000;i++){  
  Customer custmoer = new Custormer(....);  
 
  session.save(custmoer);  
 
  if(i%20==0){  
   session.flush();  
 
   session.clear();  
  }  
}  
 
tran.commit();  
 
session.close(); 

Session session = sessionFactory.openSession();

Transaction tran = session.beginTransaction();

for(int i =0;i<500000;i++){
  Customer custmoer = new Custormer(....);

  session.save(custmoer);

  if(i%20==0){
   session.flush();

   session.clear();
  }
}

tran.commit();

session.close();

在批量更新中也可以使用,此外在返回很多数据的查询时,需要使用scroll方法以便充分利用数据库的游标带来的好处。

如:

Java代码
Session session = sessionFactory.openSession();  
 
Transaction tran = session.beginTransaction();  
 
ScrollableResults customers = session.getNamedQuery("GetCustomers").setCacheMode(CacheModel.IGNORE).scroll(ScrollMode.FORWARD_ONLY);  
 
int count = 0;  
 
while(customers.next()){  
   Customer cust = (Customer )customers.get(0);  
   customer.update(...);  
 
    if(++count%20==0){  
      session.flush();  
 
      session.clear();  
  }  
}  
 
tran.commit();  
 
session.close(); 
分享到:
评论

相关推荐

    关于hibernate的批处理

    **标题**: Hibernate批处理技术详解 **描述**: Hibernate作为Java领域广泛应用的对象关系映射(ORM)框架,提供了高效的数据操作接口。在处理大数据量时,批处理技术能显著提升性能,减少数据库交互次数,降低系统...

    Hibernate批量处理

    这意味着每次向数据库提交的SQL批处理命令的数量为20。 - **标识符生成器限制**:如果使用“identity”作为主键生成策略,则Hibernate无法在JDBC层进行批量插入操作。 - **二级缓存管理**:在进行批量操作时,建议...

    hibernate的查询方式介绍和hibernate的批处理和连接池配置hibernate

    ### Hibernate 查询方式与批处理及连接池配置详解 #### 一、Hibernate 查询方式介绍 Hibernate 是一款优秀的 ORM(对象关系映射)框架,它能够极大地简化数据库操作,并提供多种查询方式来满足不同的业务需求。 #...

    hibernate 单元测试批处理代码

    在这个“hibernate 单元测试批处理代码”项目中,我们将深入探讨如何使用Hibernate进行单元测试,并实现批处理操作,特别针对MySQL数据库。 首先,让我们理解Hibernate单元测试的基础。单元测试是针对软件中的最小...

    Hibernate4.0,Hibernate5.2,Hibernate5.6 jar包

    此外,还增强了对批处理操作的支持,提高了性能。同时,4.0版本引入了新的查询语言HQL(Hibernate Query Language)和Criteria API,提供了更加灵活和强大的查询机制。 接下来是Hibernate5.2版本。这个版本进一步...

    hibernate3必要jar包

    10. **性能优化**:Hibernate提供了批处理、延迟加载、缓存策略等方法来优化性能。 这个“hibernate3必要jar包”确保了这些关键组件的存在,使得开发者可以快速地搭建一个具备基本功能的Hibernate3环境,进行数据库...

    hibernate学习资料大全

    Hibernate 提供了多种优化手段,如批处理、预加载、缓存配置等,学习如何根据项目需求进行优化,可以显著提高系统性能。 以上只是压缩包中部分可能包含的知识点,实际学习资料可能包括教程文档、示例代码、实战...

    Hibernate3的依赖包

    10. **增强的性能**:通过延迟加载、批处理和缓存机制,Hibernate能够在不牺牲性能的情况下提供强大的功能。 在Eclipse中使用这些依赖包,你需要按照以下步骤操作: 1. **创建项目**:首先,在Eclipse中创建一个新...

    Hibernate 中文api 等学习资料

    8. **性能调优**:包括批处理、连接池配置、查询优化等方面的知识。 9. **拦截器和事件监听器**:学习如何自定义行为,比如在对象保存或删除前进行额外操作。 10. **JPA集成**:如果需要,可以了解Hibernate作为...

    既可待机又可休眠的批处理文件

    在IT领域,批处理文件(Batch File)是一种在Windows操作系统中使用的简单脚本形式,它允许用户通过一组预先定义的命令来自动化任务执行。在这个特定的案例中,我们有两个批处理文件,`suspend.bat` 和 `sleep.bat`...

    hibernate_3.2官方开发包

    13. **查询优化**:Hibernate提供了SQL生成器,可以根据不同的数据库生成最优的SQL语句,同时支持批处理操作,提高性能。 这个“hibernate_3.2官方开发包”包含了源码、文档、示例等,可以帮助开发者深入了解...

    hibernate 3.6 中文 chm

    14. **性能优化**:文档还会涵盖如何通过批处理、预加载、缓存策略等手段优化Hibernate的性能。 以上只是《Hibernate 3.6 中文 CHM》文档中部分关键知识点的概述。通过深入学习和实践,开发者可以充分利用Hibernate...

    hibernate4.3.11所需jar包

    9. **性能优化**: Hibernate提供了多种性能优化手段,如批处理、延迟加载、结果集缓存等,以适应不同的应用场景。 总结来说,"hibernate4.3.11所需jar包"不仅包含Hibernate的核心库,还涉及到一系列依赖的第三方库...

    Hibernate框架jia包

    - 批量操作:利用批处理更新或删除,减少数据库交互次数。 -延迟加载(Lazy Loading):只在需要时加载关联对象,避免数据冗余。 8. **HQL和Criteria API**: HQL是面向对象的查询语言,类似于SQL但更接近Java。...

    hibernate aip hibernate aip

    7. **性能优化**:包括延迟加载(Lazy Loading)、批处理(Batch Processing)、缓存策略调整等,这些都可以提升Hibernate应用的性能。 8. **查询优化**:避免N+1查询问题,使用JOIN fetch提前加载关联数据,使用...

    达梦 Hibernate 方言 2.0 至 4.0

    5. **新功能支持**:随着Hibernate的进化,新版本的方言也会引入对如批处理操作、存储过程调用等新功能的支持,使开发者能更好地利用达梦数据库的高级特性。 6. **错误修复**:每个版本迭代通常会包含对已知问题的...

    Hibernate实战

    性能优化涉及查询优化、批处理、连接池配置等。事件监听器和拦截器允许在特定操作前后执行自定义逻辑,增强系统的可扩展性。 总之,《Hibernate实战》这本书全面覆盖了Hibernate的基础和进阶内容,对于想要掌握和...

    hibernate第一个hibernate

    另外,合理的配置和使用批处理、延迟加载等特性也能有效提升应用性能。 10. 扩展与进阶: Hibernate支持多种数据库,且与Spring框架结合使用可以实现更高级的功能,如事务的声明式管理、DAO模式的实现等。学习完...

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

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

Global site tag (gtag.js) - Google Analytics