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

Hibernate缓存策略之一级缓存

阅读更多

 

缓存相当于Map结构,讲的是命中率,就像Entryset中的key和Value。

 

Hibernate中的缓存:

  1. 一级缓存,也叫session级别的缓存,缓存的是实体
  2. 二级缓存,是SessionFactory级别的缓存,缓存的也是实体
  3. 查询缓存,也是SessionFactory级别的缓存,它缓存的是普通结果集,但如果缓存的是实体则缓存实体的Id列表

session级别的缓存即一级缓存,不能被取消,它一直存在,随着session的关闭,缓存也会随之失效!sessionFactory级别的缓存是可以取消的,甚至不用

 

    现在让我们先来看看session级别的缓存,也就是一级缓存:

  • 可以通过session的load/get操作加载实体对象,通过session的list/iterate查询实体对象,这四种操作都能把实体对象放入一级缓存

如:

 

//将发出SQL查询语句查询实体对象的数据
Person p1 = (Person)session.load(Person.class, 1);
System.out.println(p1.getName());
           
 //实体对象已经被缓存,所以下列操作不再发出SQL语句
Person p2 = (Person)session.load(Person.class, 1);
System.out.println(p2.getName());
 

 

         因此可以这样理解,持久化对象都在一级缓存里边,如果session关闭之后,那么当前session对象中的一级缓存已经被清空 ,这时候你再启动一个session的话,他还是会发送sql语句到内存中查找那个实体,因为当前的session对象已被一级缓存给清空了。

       接着看看list和iterate操作:他们都能够缓存实体到一级缓存中

			//下面这个操作,会导致hibernate发出SQL语句查询两个实体对象到一级缓存中
List persons = session.createQuery(
                    "select p from Person p where p.id in (1,2)")	.list();
for (Iterator iterator = persons.iterator(); iterator.hasNext();) {
				Person p = (Person ) iterator.next();
				System.out.println(p.getName());
			}
			
			//不会再发出查询语句
			Person cp = (Person )session.load(Person .class, 1);
			System.out.println(cp.getName());
			
			//实体对象已经被缓存,所以下列操作不再发出SQL语句
			Person cp1 = (Person )session.get(Person .class, 1);
			System.out.println(cp1.getName());
			
			//实体对象已经被缓存,所以下列操作不再发出SQL语句
			Person cp2 = (Person )session.get(Person .class, 2);
			System.out.println(cp2.getName());
			
			//因为本实体对象不在一级缓存中,所以下面将发出SQL语句查询实体对象
			Person cp3 = (Person )session.get(Person .class, 3);
			System.out.println(cp3.getName());

  具体的list和iterate区别见1+N文章!

 

  • 接下来研究下一级缓存的管理:

清空一级缓存,表示这个对象不再是持久化对象了,他应该是个离线的对象。

session.clear()清空所有的一级缓存,session.evict()清楚一级缓存中某个实体缓存。

Person p = (Person)session.get(Person.class, 4);
p.setName("士兵乙");
//清空一级缓存里面的所有的持久化对象!
//session.clear();
//清楚一级缓存里面的某个持久化对象!
session.evict(p);
session.getTransaction().commit();
  1.  再看看下面更新关联丢失的解决之道:
//这是一个离线对象,假设这个对象从呈现层中传过来的!
Person p = new Person();
p.setId(1);
p.setQq("1234567");
p.setAddress("上海!");
p.setName("xxxxx");
//假设为了不丢失Person与Group对象之间的关联,我们先加载原来的Person
Person oldp = (Person)session.get(Person.class, p.getId());
//把原来的关联关系,设置到新的对象中
p.setGroup(oldp.getGroup());
//更新新的对象!
//update方法会把p对象放入一级缓存
//上面的get操作,把oldp对象也放入了一级缓存
//p对象和oldp对象,不是同一个对象
//但p对象和oldp对象具有相同的数据库标识!
//所以下面的update操作,将抛出异常:org.hibernate.NonUniqueObjectException


: a different object 
//with the same identifier value was already associated with the session翻译过来如下:
//因为在Hibernate中,同一个session中,不允许存在两个具有相同数据库标识的同一种类型的实体对象




//session.update(p);
session.getTransaction().commit();

 那应该怎么解决呢?方法一:

//解决上述问题的方法之一:就是
//利用session一级缓存的管理机制,先把oldp对象从一级缓存中清除
session.evict(oldp);
session.update(p);

 解决它的第二个办法:

//解决上述问题的方法之二:
//利用session中的merge方法来更新p对象!
//merge方法,相当于把某个离线状态的对象拷贝到某个对应的持久化对象中
//相当于把p拷贝到oldP中,从而更新oldP中所有的属性
session.merge(p);
  1.   在批量插入数据时如有100万条数据时,这时不可能一次性把这么多数据全部持久化到数据库中,我们应当批量地插入,如100条的插入,当插入了100条后,即全部写进去后,也就是flush干净 了,这时候把一级缓存清空一下以便下一批数据的批量插入,从而保证缓存的可用,而不会导致一次性插入大量数据致使内存溢出的情况
for(int i=0; i<1000000000; i++){
	Person p = new Person();
	p.setAddress("xxx");
	//...p.setXXX
	session.save(p);
	if(i % 100 == 0){
		session.flush();
		session.clear();
	}
}
 

 

分享到:
评论

相关推荐

    Hibernate缓存策略(一级缓存、二级缓存).docx

    Hibernate是一个持久化框架,经常需要访问数据库。如果我们能够降低应用程序对物理数据库访问的频次,那会提供应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序运行时先从缓存中读写数据。

    Hibernate缓存技术研究

    Hibernate是一种面向Java环境的ORM工具。系统地分析了Hibernate的缓存结构,并描述了二级缓存的查询过程、缓存策略;同时总结了二级缓存使用中的一些限制,以及使用二级缓存的优化策略。

    day37 05-HIbernate二级缓存:一级缓存更新同步到二级缓存及二级缓存配置文件

    NULL 博文链接:https://364232252.iteye.com/blog/2369161

    hibernate 3中的缓存小结

    以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。...

    hibernate基础教程

    Hibernate中使用了一级缓存和二级缓存的机制来提高程序的性能. 一 为什么要使用缓存? 缓存是一块存储区域,可能是一块内存,也可能是一块硬盘.缓存能起到缓冲的作用,把程序经常使用...

    Java缓存框架Java缓存框架

    多种缓存策略 4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题 5. 缓存数据会在虚拟机重启的过程中写入磁盘 6. 可以通过RMI、可插入API等方式进行分布式缓存 7. 具有缓存和缓存管理器的侦听接口 8. 支持多...

    Hibernate缓存管理

    doc格式。当多个并发的事务同时访问持久化层的缓存的相同数据时,会引起并发...在进程范围或集群范围的缓存,即第二级缓存,会出现并发问题。因此可以设定四种类型的并发访问策略,每一种策略对应一种事务隔离级别。

    Ehcache分布式缓存与其在SpringBoot应用

    EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点...3)多种缓存策略 4)缓存数据有两级:内存和磁盘,因此无需担心容量问题 5)缓存数据会在虚拟机重启的过程中写入磁盘 6)可以通过 RMI、可插入 API

    Hibernate学习笔记

    Hibernate 学习笔记 get和load的区别 一对一,一对多,多对多 悲观锁,乐观锁 hibernate查询语言hql hibernate一级缓存、二级缓存 抓取策略

    Java缓存框架 Ehcache.zip

    多种缓存策略4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题5. 缓存数据会在虚拟机重启的过程中写入磁盘6. 可以通过RMI、可插入API等方式进行分布式缓存7. 具有缓存和缓存管理器的侦听接口8. 支持多缓存管理...

    马士兵hibernate学习笔记(原版)

    目录 课程内容 1 HelloWorld 2 Hibernate原理模拟 - 什么是O/R Mapping以及为什么... 4 一级缓存和二级缓存和査询缓存(面试题)(详见hibernate_3000_Hibernate_3KindsOf_Cache) 5 事务并发处理(面试的意义更大)

    hibernate学习笔记

    Hibernate 学习笔记 ...一级缓存 44 快取 45 hibernate二级缓存 47 Hibernate Gossip: 二级快取(Second-level) 48 hibernate查询缓存 50 hibernate抓取策略 53 Hibernate最佳实践(Best Practices) 55

    spring hibernate 事务管理学习笔记(二)

    NULL 博文链接:https://microjava.iteye.com/blog/525981

    08.拓薪教育-hibernate4.3的hibernate.cfg.xml基本配置.part2

    高级Hibernate4开发技术:ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,...

    Hibernate+中文文档

    19.1. 缓存策略提供商(Cache Providers) 19.2. 各种缓存提供商对缓存并发策略的支持情况(Cache Concurrency Strategy Support) 20.1. Summary 20.2. SchemaExport命令行选项 20.3. SchemaExport 连接属性 ...

    Ehcache Java 缓存框架 v3.6.1

    多种缓存策略4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题5. 缓存数据会在虚拟机重启的过程中写入磁盘6. 可以通过RMI、可插入API等方式进行分布式缓存7. 具有缓存和缓存管理器的侦听接口8. 支持多缓存管理...

    HibernateAPI中文版.chm

    19.1. 缓存策略提供商(Cache Providers) 19.2. 各种缓存提供商对缓存并发策略的支持情况(Cache Concurrency Strategy Support) 20.1. Summary 20.2. SchemaExport命令行选项 20.3. SchemaExport 连接属性 ...

    hibernate3.2中文文档(chm格式)

    19.1. 缓存策略提供商(Cache Providers) 19.2. 各种缓存提供商对缓存并发策略的支持情况(Cache Concurrency Strategy Support) 20.1. Summary 20.2. SchemaExport命令行选项 20.3. SchemaExport 连接属性 ...

    08.拓薪教育-hibernate4.3的hibernate.cfg.xml基本配置.part1

    高级Hibernate4开发技术:ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     22.3 管理Hibernate的第一级缓存  22.4 管理Hibernate的第二级缓存  22.4.1 配置进程范围内的第二级缓存  22.4.2 配置集群范围内的第二级缓存  22.4.3 在应用程序中管理第二级缓存  22.4.4 Session与第二级...

Global site tag (gtag.js) - Google Analytics