`

关于对Hibernate一级缓存的理解

阅读更多
Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveorupdate()等方法 及调用查询接口list,filter,iterate时,如session缓存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中,
当Session关闭的时候该Session所管理的一级缓存也会立即被清除
Hibernate的一级缓存是Session所内置的,不能被卸载,也不能进行任何配置

一级缓存采用的是key-value的Map方式来实现的,在缓存实体对象时,对象的主关键字ID是Map的key,实体对象就是对应的值。所以说,一级缓存是以实体对象为单位进行存储的,在访问的时候使用的是主关键字ID
虽然,Hibernate对一级缓存使用的是自动维护的功能,没有提供任何配置功能,但是可以通过Session中所提供的方法来对一级缓存的管理进行手工干预。Session中所提供的干预方法包括以下两种
evict() :用于将某个对象从Session的一级缓存中清除
evict()方法适用于以下二种情况:
1)不需要该对象进行同步的数据更新
2)在批量进行更新与删除时,当更新删除每一个对象后,要释对此对象所占用的内存.

clear() :用于将一级缓存中的所有对象全部清除。
     
在进行大批量数据一次性更新的时候,会占用非常多的内存来缓存被更新的对象。这时就应该阶段性地调用clear()方法来清空一级缓存中的对象,控制一级缓存的大小,以避免产生内存溢出的情况。
Hibernate大批量更新时缓存的处理方法:
(假设我们user表的age有5000条大于0的记录)
Session session =SessionFactory.openSession();
Transaction tx =session.beginTransaction();
Itertaor users=session.find("from User u where u.age>0").itertaor();
//HSL语句就不做解释了
while(user.hasNext()){
User user =(User)users.next();
user.setAge(user.getAge()+1);
//将本批插入的对象立即写入数据库并释放内存
session.flush();
session.clear();
}
tx.commit();
session.close();

用Hibernate处理大批数据时..都必须先执行5000次的update语句,然后才能更新5000个user 对象..
这样就影响到了操作上的性能,在项目当我们遇到性能与空间的问题时,要以性能为主,这也就是说要牺牲空间

所以程序最好跳过Hibernate API  而直接通过JDBC API来执来

我们改一下上面的代码:
Session session=SessionFactory.openSession();
Transaction tx =session.beginTransaction();
Connection conn =session.connection();
PreparedStatement  pstmt = conn.prepareStatement("update users set age=age+1 "+"where age >0");
pstmt.executeUpdate();
tx.commit();


虽说这是通过JDBC API搞作的..但本质上还是通过Hibernater Transaction的事务这个接口来声明事务的边界的

其实最好的解决方法就是以创建存储过程,用底层的数据库运行..这样性能好,速度快

我就简单的以Oracle数据库为例子.创建一个名为UserUpdate的存储过程,然后在程序中进行调用
     UserUpdate的存储过程代码:
          create or  replace procadure UserUpdate(u_age in number) as
                      begin
                update users set age=age+1 where age>u_age;
                     end;   
  下面的是在程序中如何调用我们命名的存储过程
                    Session session =SessionFactory.openSession();
                     Transaction tx =session.beginTransaction();
                     Connection conn=session.connection();
                   String str="{call UserUpdate(?)}";
                   CallableStatement cstmt= conn.prepareCall(str);
                   cstmt.setInt(1,0);
                  cstmt.executeUpdate();
                  tx.commit();  


注意.开源的MySQL中不支持存储过程的..
用JDBC API的好处是这样的..
它不用把大批量的数据事先加载到内存中,然后再进行更新与修改..所以不会消耗大量内存.
(小程序中是看不出什么差别的,当数据的记录达到一定的数据量的时候自然会发现用Hibernate API 与JDBC API的差别)
在一个就是只能一条记录进行批量更新,不像Hibernate中更新每一条的..

不过在很多方面上Hibernate还是很强大的,完全实现了面向对角的思想,HQL的检索也是面向对象的
分享到:
评论

相关推荐

    hibernate一级缓存、二级缓存和查询缓存

    **hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...

    hibernate一级缓存

    **hibernate一级缓存详解** 在Java的持久化框架Hibernate中,一级缓存是其核心特性之一,它为提高数据库操作效率、减少对数据库的访问提供了重要支持。一级缓存,也称为session缓存,是每个Hibernate Session内部...

    Hibernate一级缓存和二级缓存

    标题“Hibernate一级缓存和二级缓存”指的是Hibernate框架中的两种缓存机制,它们是提高数据访问性能的关键要素。一级缓存是Session级别的,而二级缓存是SessionFactory级别的,两者在数据库操作中起到了重要的作用...

    hibernate一级和二级缓存配置与详解

    但是,可以通过设置`hibernate.cache.use_query_cache`来禁用查询缓存,防止对一级缓存造成影响。 ### 二级缓存 二级缓存是SessionFactory级别的,可以跨Session共享。相比一级缓存,二级缓存可以持久化存储,即使...

    hibernate的一级缓存和二级缓存

    《深入理解Hibernate的一级缓存与二级缓存》 Hibernate作为一款强大的ORM框架,其缓存机制是优化数据库操作性能的关键之一。缓存主要分为一级缓存和二级缓存,它们各自承担着不同的职责,共同提升了数据访问的效率...

    hibernate二级缓存实例

    一级缓存是Session级别的,每个Session都有自己的一级缓存,用于存储当前Session操作的对象。而二级缓存则是SessionFactory级别的,它跨越了多个Session,是全局共享的,可以被多个并发的Session共同使用。 二级...

    Hibernat一级缓存(源码)

    Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库。...提供的 "student" 文件可能包含了关于 Hibernate 一级缓存实现的示例代码,可以进一步帮助理解和学习。

    hibernate二级缓存示例源码

    Hibernate的一级缓存是Session级别的,它自动管理对象的状态,提供瞬时、持久化和脱管状态之间的转换。然而,一级缓存的范围有限,当Session关闭时,其中的数据会被清除。为了解决这个问题,Hibernate引入了二级缓存...

    hibernate二级缓存java包下载

    - 一级缓存:每个 Hibernate Session 对象都有一个一级缓存,它是默认开启的。当对象被加载到 Session 中,它们会被存储在一级缓存中,直到 Session 被关闭。一级缓存是事务范围的,只对当前 Session 可见。 - 二...

    Hibernate 二级缓存 总结整理

    当我们在Session中对实体进行CRUD操作时,数据会首先被缓存到一级缓存中,同一Session内的后续查询会优先从一级缓存中获取数据,避免了频繁访问数据库。 2. **二级缓存(Second-Level Cache)**:一级缓存的局限...

    Hibernate性能优化:一级缓存

    压缩包文件“hibernate_cache_level1”可能包含与一级缓存相关的示例代码、配置文件或文档,可以帮助开发者更深入地理解一级缓存的实现和优化。例如,其中可能有示例展示了如何配置SessionFactory的缓存区域大小,...

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    通常,一级缓存由Hibernate Session管理,而二级缓存则可以跨越多个Session进行共享。 在Spring Boot项目中配置Redis作为Hibernate的二级缓存,我们需要以下步骤: 1. **添加依赖**: 首先,在`pom.xml`文件中...

    Hibernatehibernate一级缓存.pdf

    这显示了Hibernate一级缓存如何提高性能,避免重复的数据库访问。 总结起来,Hibernate的一级缓存是一个关键特性,它提高了数据访问的效率并降低了数据库的负载。正确理解和使用一级缓存,以及学会管理缓存,是优化...

    hibernate二级缓存(包括注解方式)

    1. **Hibernate二级缓存**:在默认情况下,Hibernate只使用一级缓存(Session级别的缓存),二级缓存则可由用户自定义配置。二级缓存是多个Session共享的,可以跨事务存储对象,提高了数据读取速度,减少了对数据库...

    Hibernate二级缓存+分页功能

    Hibernate一级缓存是指Session级别的缓存,它是默认开启的,每个Session都会维护一个对象缓存,用来存放该Session加载的实体对象。一级缓存的生命周期与Session相同,当Session关闭时,一级缓存中的数据也会被清除。...

    Hibernate4二级缓存实例(源码)

    1. **Hibernate二级缓存**:二级缓存是Hibernate在一级缓存(Session级别的缓存)之外提供的全局共享缓存,可以跨Session共享数据。它允许多个并发用户访问相同的数据,减少对数据库的访问次数,提高系统性能。 2. ...

    hibernate对二级缓存的理解

    然而,许多人对Hibernate的二级缓存可能存在误解,因此深入理解其工作原理至关重要。 Hibernate的一级缓存是由Session提供的,它是一个事务级别的缓存,即每个Session都有自己的缓存空间。当同一个ID在同一个...

    hibernate二级缓存

    Hibernate的缓存可以分为两个层次:一级缓存和二级缓存。 - **一级缓存**:这是由Hibernate自动管理的缓存,也称为Session级别的缓存。每当一个Session被创建,就会有一个与之关联的一级缓存。一级缓存主要用于存储...

Global site tag (gtag.js) - Google Analytics