`
tianlovv
  • 浏览: 15178 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

hibernate中批量处理的解决方案

阅读更多

实际开发中的一些问题:
批量的修改数据库字段(大数据量),

因为hibernate中提供了批量处理 的解决方案


Hibernate批量处理其实从性能上考虑,它是很不可取的,浪费了很大的内存。从它的机制上讲,Hibernate它是先把符合条件的数据查出来,放到内存当中,然后再进行操作。实际使用下来性能非常不理想,在笔者的实际使用中采用下面的第三种优化方案的数据是:100000条数据插入数据库,主流台式机的配置,需要约30分钟,呵呵,晕倒。
总结下来有三种来处理以解决性能问题:

 


1:绕过Hibernate API ,直接通过 JDBC API 来做,这个方法性能上是比较好的。也是最快的。
2:运用存储过程。
3:还是用Hibernate API 来进行常规的批量处理,可以也有变,变就变在,我们可以在查找出一定的量的时候,及时的将这些数据做完操作就
删掉,session.flush();session.evict(XX对象集); 这样也可以挽救一点性能损失。这个“一定的量”要就要根据实际情况做定量参考了。一般为30-60左右,但效果仍然不理想。
1:绕过Hibernate API ,直接通过 JDBC API 来做,这个方法性能上是比较好的,也是最快的。(实例为 更新操作)
Transaction tx=session.beginTransaction(); //注意用的是hibernate事务处理边界
Connection conn=session.connection();
PreparedStatement stmt=conn.preparedStatement("update CUSTOMER as C set C.sarlary=c.sarlary+1 where c.sarlary>1000");
stmt.excuteUpdate();
tx.commit(); //注意用的是hibernate事务处理边界
这小程序中,采用的是直接调用JDBC 的API 来访问数据库,效率很高。避免了Hibernate 先查询出来加载到内存,再进行操作引发的性能问题

2:运用存储过程。但这种方式考虑到易植和程序部署的方便性,不建议使用.(实例为 更新操作)如果底层数据库(如Oracle)支持存储过程,也可以通过存储过程来执行批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数
据库中可以定义一个名为batchUpdateCustomer()的存储过程,代码如下:

代码内容
create or replace procedure batchUpdateCustomer(p_age in number) as
begin
update CUSTOMERS set AGE=AGE+1 where AGE>p_age;
end; 

以上存储过程有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:
代码内容
tx = session.beginTransaction();
Connection con=session.connection();
String procedure = "{call batchUpdateCustomer(?) }";
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); //把年龄参数设为0
cstmt.executeUpdate();
tx.commit(); 

从上面程序看出,应用程序也必须绕过Hibernate API,直接通过JDBC API来调用存储过程。
3:还是用Hibernate API 来进行常规的批量处理,可以也有变,变就变在,我们可以在查找出一定的量的时候,及时的将这些数据做完操作就删掉,session.flush();session.evict(XX对象集); 这样也可以挽救一点性能损失。这个“一定的量”要就要根据实际情况做定量参考了。。
(实例为 保存操作)
业务逻辑为:我们要想数据库插入10 0000 条数据
tx=session.beginTransaction();
for(int i=0;i[size=x-small;]         {
                  session.flush();
                  session.clear();
         }
}

这样可以把系统维持在一个稳定的范围

批量插入:
//打开session
Session session = sessionFactory.openSession();
Transaction tx = session.begainTransaction();
//循环100000次,插入100000条记录
for(int i = 0;i<=100000;i++){
           //创建User实例
           User u1 = new User();
           u1.setName("XXXX"+i);
           u1.setAge(i);
           u1.setAddress("China");
           //在Session级别缓存user实例
           session.save(u1);
           //每当累加器是20 的倍数时,将session中的数据刷如数据库,并清空session缓存
           if(i%20==0){
                      session.flush();
                      session.clear();
                      tx.commit();
                      tx = session.beginTransaction();
           }
}
//提交事物
tx.commit();
//关闭事物
hibernateUtil.closeSession();

 

 

hibernate中2级缓存还需配置:hibernate.cache.use_second_level_cache false



批量更新:
//打开session

Session session = sessionFactory.openSession();
//开始事物
Transaction tx = session.begainTransaction();
//查询出User表中的所有数据
ScrollableResult user = session.createQuery("from user")
           .setCacheMode(Cache.Mode.IGNORE).scroll(ScrollMode.FOREARD_ONLY);
int count = 0;
//遍历user表中所有的记录
while (user.next()){
           User u = (User)users.get(0);
           u.setName("新用户名"+count);
           //当count为20的倍数时,将更新的结果从session中刷新到数据库
           if(++count%20==0){
                       session.flush();
                       session.clear();
           }
}
//提交事物
tx.commit();
//关闭事物
hibernateUtil.closeSession();
但是这种风格的语句性能较低

可以使用hibernate提供的HQL批量的更新和删除 UPDATE|DELETE FROM? ClassName [WHERE WHERE_CONDITIONS]
假设批量更新User类实例的name属性,可以如下代码:
private void testUser()throws Exception{
            //打开session            
            Session session = sessionFactory.openSession();
            //开始事物
            Transaction tx = session.begainTransaction();
            //定义批量更新的HQL语句
            String hqlUpdate = "update User set name =:newName";
            //执行更新
            int updateEntities = session.createQuery(hqlUpdate)
                                 .setString("newName","新名字").executeUpdate();
            //提交事物
            tx.commit();
            //关闭事物
            hibernateUtil.closeSession();
}
批量的删除HQL:
private void testUser()throws Exception{
            //打开session
            Session session = sessionFactory.openSession();
            //开始事物
            Transaction tx = session.begainTransaction();
            //定义批量更新的HQL语句
            String hqlUpdate = "delete User";
            //执行批量删除
            int updateEntities = session.createQuery(hqlUpdate).executeUpdate();
            //提交事物
            tx.commit();
            //关闭事物
            hibernateUtil.closeSession();
}
Query.executeUpdate()方法返回 的是一个整型值,该值是受此操作影响的记录条数

分享到:
评论

相关推荐

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

    在Java开发中,尤其是涉及到大数据量的处理时,人们往往会质疑ORM框架,如Hibernate,是否适合进行批量数据操作。然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。...

    Hibernate中大量数据的更新

    在 Hibernate 配置文件中,可以设置 `hibernate.jdbc.batch_size` 参数来指定批量抓取的大小。 如何实现批量更新 在 Controller 层,需要将大量数据插入到数据库时,可以使用以下方法: ```java for (int i = 0; ...

    Hibernate批量处理

    ### Hibernate批量处理详解 #### 一、批量处理概述 Hibernate作为一种强大的对象关系映射(ORM)框架,提供了多种批量处理的方式以提高数据处理效率。批量处理对于需要在短时间内处理大量数据的应用尤其重要,如...

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

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

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

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

    Java中Hibernate的批量插入

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

    java数据批量处理

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

    Hibernate 中文参考文档

    通过提供数据持久化的解决方案,Hibernate提高了开发效率,降低了数据库访问的复杂性。 ### 2. 安装与配置 在开始使用Hibernate之前,需要将其库文件添加到项目的类路径中。`Hibernate3.1_DOC_CN.chm`文件包含的是...

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

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

    hibernate中文参考文档.pdf

    Hibernate是Java平台下的一款开源的对象关系映射(ORM)框架,它提供了一种解决方案,用于将面向对象的Java应用程序与关系型数据库进行交互。通过Hibernate,开发者可以使用面向对象的方式编写数据访问层代码,而...

    Hibernate中文文档

    #### 六、常见问题与解决方案 - **懒加载异常**:当尝试访问未初始化的关联对象时抛出异常,解决方法是在适当的时候显式调用 initialize 方法。 - **脏读**:由于事务隔离级别设置不当导致的问题,可以通过调整事务...

    Hibernate中文参考手册

    - **问题解决**: 针对实际开发过程中可能遇到的问题给出解决方案和建议。 ### 结语 通过对上述知识点的系统学习,读者不仅能掌握Hibernate的基本用法,还能深入了解其背后的原理与设计思想,为进一步探索更广泛的...

    Hibernate+JDBC实现批量插入、更新及删除的方法详解

    Hibernate+JDBC实现批量插入、更新及删除的方法详解 概述:本文主要介绍了Hibernate+...本文通过实例形式详细分析了Hibernate+JDBC实现批量插入、更新及删除的方法,提供了批量操作的各种技巧和解决方案,供大家参考。

    hibernate的xml文件bug

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

    hibernate中文文档

    Hibernate是一款强大的Java持久化框架,它为Java开发者提供了一种对象关系映射(ORM)解决方案,使得在Java应用中管理数据库变得更加便捷。本中文文档旨在详细介绍Hibernate的核心概念、配置、使用方法以及最佳实践。 ...

    Struts2关于批量提交数据-解决方案

    ### Struts2批量提交数据解决方案 在Web应用开发过程中,特别是在使用Struts2框架时,经常需要处理大量的数据提交操作。这些数据可能来自于用户输入或者是系统内部的数据迁移等场景。对于这种需求,本文档将详细...

    extjs+struts+hibernate做的文件批量上传源代码

    总的来说,这个项目结合了ExtJS的前端交互性,Struts的控制逻辑,以及Hibernate的数据持久化能力,提供了一个完整的文件批量上传解决方案。用户可以方便地上传、查看和管理文件,而系统则能确保数据的一致性和安全性...

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

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

    hibernate介绍

    Hibernate 是一个开放源代码的 Java 持久化框架,它为对象关系映射(Object Relational Mapping, ORM)提供了一套完整的解决方案。ORM 是一种将面向对象程序设计语言中对象的状态存储到数据库中的机制。在 ORM 的...

    hibernate4.3.7.zip

    综上所述,Hibernate 4.3.7 提供了全面的ORM解决方案,通过其丰富的特性、良好的性能以及对现代Java生态系统的支持,极大地简化了企业级应用的数据库开发工作。对于Java开发者来说,深入理解和熟练运用Hibernate是...

Global site tag (gtag.js) - Google Analytics