`

Hibernate读书笔记-----hibernate的批量处理

阅读更多

Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象,将被自动转换为对数据库的操作。但存在这样一个问题,如果我们想同时更新100000条记录,是不是要逐一加载100000条记录,然后依次调用setter方法。采用这种方法实在是太繁琐了,而且严重影响了数据的访问性能。Hibernate提供的批量处理的方案来解决这个问题。

 

一、批量插入

 

如果我们需要插入100000条记录,通过hibernate可能会采用如下的方式处理:

Java代码 
  1. Session session = HibernateUtil.getSession();  
  2. Transaction tx = session.beginTransaction();  
  3. for (int i = 0; i < 100000; i++) {  
  4.     User user = new User();  
  5.     user.setName("userName"+i);  
  6.     user.setAge(i);  
  7.     session.save(session);  
  8. }  
  9. tx.commit();  
  10. session.close();  

但是这个程序存在一个问题:当程序运行到某个地方,总是会抛出OutOfMemoryException内存溢出异常。这是因为Hibernate的Session持有一个必选的一级缓存,所有的User实例都会Session级别的缓存区进行缓存的缘故。

如果你要执行批量处理并且想要达到一个理想的性能,那么使用JDBC的批量(batching)功能是至关重要。将JDBC的批量抓取数量(batchsize)参数设置到一个合适值。

Html代码 
  1. <property name="jdbc.batch_size">20</property>  

可能也会想到关闭二级缓存:

Html代码 
  1. hibernate.cache.use_second_level_cache false  

但这个并不是必须的。

解决这个问题的方案就是:定时的将session的缓存数据刷入数据库,同时通过调用clear()来控制一级缓存的大小。如下:

Java代码 
  1. static void addUser() throws Exception{  
  2.         Session session = HibernateUtil.getSession();  
  3.         Transaction tx = session.beginTransaction();  
  4.         //循环1000次,插入1000条记录  
  5.         for(int i = 0;i < 100000;i++){  
  6.             //创建User对象  
  7.             User user = new User();  
  8.             user.setName("userName"+i);  
  9.             user.setAge(i);  
  10.               
  11.             //在session级别缓存User实例  
  12.             session.save(user);  
  13.               
  14.             //每当累加器是20的倍数的时候,将session中数据刷入数据库,并且情况session缓存  
  15.             if(i%20==0){  
  16.                 session.flush();  
  17.                 session.clear();  
  18.             }  
  19.         }  
  20.   
  21. <span style="font-size: 16px;"></span>  

 

二、批量更新

上面介绍的方法同样也适用于批量更新。在进行会返回很多行数据的查询时,你需要使用scroll()方法以便充分利用服务器端游标所带来的好处。

Java代码 
  1. static void updateUser() throws Exception {  
  2.         Session session = HibernateUtil.getSession();  
  3.         Transaction tx = session.beginTransaction();  
  4.         //查询出User表中所有的记录  
  5.         ScrollableResults re = session.createQuery("from User").setCacheMode(CacheMode.IGNORE).scroll(ScrollMode.FORWARD_ONLY);  
  6.         int count = 1;  
  7.         while(re.next()){  
  8.             User user = (User) re.get(0);  
  9.             //当count=20的倍数时,将更新的结果从session中flush到数据库  
  10.             user.setName("新用户:"+count);  
  11.             if(++count%20==0){  
  12.                 session.flush();  
  13.                 session.clear();  
  14.             }  
  15.         }  
  16.         tx.commit();  
  17.         session.close();  
  18.     }  


通过这种方式,虽然可以进行批量更新,但由于它需要先执行数据查询,然后才能执行数据更新,所以执行效率不高。为了避免这种情况,我们可以使用DML风格进行数据的批量更新。

 

三、DML风格的批量更新/删除

Hibernate提供通过Hibernate查询语言(HQL)来执行大批量SQL风格的DML语句的方法。

批量update、delete语句的语法格式如下:(UPDATE|DELETE)FROM?EntityName(WHEREwhere_conditions)。

这里需要注意如下几点:

1、在FROM子句中,FROM关键字是可选的。

2、在FROM子句(from-clause)中只能有一个实体名,它可以是别名。如果实体名是别名,那么任何被引用的属性都必须加上此别名的前缀;如果不是别名,那么任何有前缀的属性引用都是非法的。

3、不能在批量HQL语句中使用连接,显式或者隐式的都不行。不过在WHERE子句中可以使用子查询。可以在where子句中使用子查询,子查询本身可以包含join。

4、整个WHERE子句是可选的。

实例:使用Query.executeUpdate()方法执行一个HQLUPDATE语句

 

Java代码 
  1. static void updateUser() throws Exception{  
  2.         Session session = HibernateUtil.getSession();  
  3.         Transaction tx = session.beginTransaction();  
  4.           
  5.         //定义批量更新的HQL语句  
  6.         String hql = "update User as user set user.name = :name";  
  7.         //执行更新  
  8.         session.createQuery(hql).setString("name""name").executeUpdate();  
  9.           
  10.         tx.commit();  
  11.         session.close();      
  12.     }  


使用这种批量更新语法时,通常只需要执行一次SQL的update语句,就可以完成所有满足条件记录的更新。但也有可能需要执行多条update语句,这是因为有继承映射等情况。

执行一个HQLDELETE,同样使用Query.executeUpdate()方法:

Java代码 
  1. //使用DML风格的批量删除  
  2.     static void deleteUser() throws Exception{  
  3.         Session session = HibernateUtil.getSession();  
  4.         Transaction tx = session.beginTransaction();  
  5.           
  6.         //定义批量更新的HQL语句  
  7.         String hql = "delete User";  
  8.           
  9.         //执行删除  
  10.         session.createQuery(hql).executeUpdate();  
  11.           
  12.         tx.commit();  
  13.         session.close();      
  14.     }  


Query.executeUpdate()方法返回一个整型值,该值是受此操作影响的记录数量。

7
10
分享到:
评论
2 楼 aijuans2 2012-07-07  
1 楼 和未来 2012-07-06  
顶下楼主 呵呵 

相关推荐

    hibernate总结--云图智联

    然而,Hibernate也有其局限性,比如对于大量使用存储过程和批量操作的应用场景,它可能不是最佳选择。不过,它的这些缺点并不影响它在多数项目中的应用价值。 Hibernate框架可以进行配置,实现多种功能。例如,通过...

    Hibernate映射笔记

    例如,合理使用懒加载(`lazy`)、批量处理(`batch-size`)等特性,可以有效减少数据库操作次数,提升系统响应速度。此外,针对不同的数据库特性选择合适的主键生成策略,也是优化系统性能的关键因素之一。 总之,...

    马士兵java框架hibernate学习笔记

    ### 马士兵Java框架Hibernate学习笔记 #### 一、HelloWorld - **知识点概述**: - **项目搭建**:介绍了如何从零开始搭建一个简单的Hibernate项目。 - **环境配置**:包括了如何配置MySQL数据库、创建必要的表...

    达内HIBERNATE学习笔记

    根据提供的信息,我们可以总结出以下关于达内HIBERNATE学习笔记的重要知识点: ### 第一章:Hibernate入门 #### 1.1 学习目标 - 理解Hibernate的基本概念。 - 掌握如何使用Hibernate进行开发。 #### 1.2 对象持久...

    马士兵hibernate学习笔记

    ### 马士兵Hibernate学习笔记知识点总结 #### 一、HelloWorld示例 - **目的**:通过简单的示例理解Hibernate的基本使用流程。 - **步骤**: - 创建Java项目`hibernate_0100_HelloWorld`。 - 建立库依赖,包括...

    Hibernate笔记

    ### Hibernate笔记 #### 一、概述 Hibernate 是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互过程。通过使用Hibernate,开发者可以将对象模型与关系型数据库模型进行映射,从而避免...

    hibernate-note学习笔记

    ### hibernate-note学习笔记知识点详解 #### 一、对象持久化 **1.1 概述** 对象持久化是指将程序中的对象状态保存到非易失性存储中(如硬盘或磁盘等),以便在系统重启后仍能保留这些状态。这种技术常用于将对象的...

    Hibernate全部笔记

    **Hibernate 全部笔记** Hibernate 是一款开源的Java平台上的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式来处理数据库事务。本笔记将深入探讨Hibernate的核心概念、...

    SSH笔记-管理Session和批量操作数据库

    - 需要注意批量操作时的参数设置,如批大小(batch size),以及在出现错误时如何处理剩余的SQL语句。 5. **通过SessionFactory的Session进行批量操作**: - Hibernate的SessionFactory是线程安全的,可以创建多...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    Java相关课程系列笔记之十四Hibernate学习笔记.doc

    ### Java相关课程系列笔记之十四:Hibernate学习笔记 #### 一、Hibernate的概述 ##### 1.1 Hibernate框架的作用 Hibernate是一个开源的对象关系映射(Object Relational Mapping, ORM)框架,它允许开发者以面向...

    hibernate学习笔记

    `批量更新.PNG` 解释了如何利用Hibernate进行批量插入、更新和删除操作,这是优化性能的重要手段,尤其是在处理大量数据时。 综上所述,这份"hibernate学习笔记"全面覆盖了Hibernate的主要方面,包括对象生命周期...

    Spring 和Hibernate 整合笔记和jar包

    - **批处理**:Spring可以设置批处理大小,批量处理数据库操作,提升效率。 7. **测试与调试** - **单元测试**:Spring Test和Hibernate Test支持对整合后的应用进行单元测试,如使用JUnit和Mockito。 - **日志...

    SSH笔记-类型转换器和错误信息显示、复杂属性、批量更新模型数据

    总的来说,"SSH笔记-类型转换器和错误信息显示、复杂属性、批量更新模型数据"涵盖了SSH框架中与数据处理和用户交互密切相关的几个核心概念。理解并熟练掌握这些知识点,对于高效地开发Java Web应用至关重要。无论是...

    Hibernate学习笔记!

    3. **批处理**: 设置hibernate.jdbc.batch_size,批量处理数据库操作,提高性能。 4. **缓存策略优化**: 合理利用缓存,减少对数据库的访问,提高系统响应速度。 5. **避免N+1查询问题**: 在一对多关系中,使用...

    Hibernate学习笔记(培训学习时的笔记)

    本笔记将深入探讨Hibernate的核心概念、配置、实体管理、查询语言以及事务处理等方面,帮助读者理解并掌握这个框架。 一、Hibernate核心概念 1. Object-Relational Mapping(ORM):Hibernate通过ORM将Java对象与...

    韩顺平.2011版.hibernate3.3 笔记 ppt 汇总

    《韩顺平.2011版.hibernate3.3 笔记 ppt 汇总》是一份关于Hibernate框架深入学习的资源集合,由知名讲师韩顺平精心编撰。Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java开发者在数据库层面上的...

    Hibernate笔记.zip

    本笔记将深入探讨Hibernate的核心概念、配置、实体映射、查询语言以及其在实际项目中的应用。 1. Hibernate简介 Hibernate是一个开源的ORM框架,它提供了一种在Java应用程序中持久化对象的方式,将对象模型和关系...

Global site tag (gtag.js) - Google Analytics