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

Hibernate中Session的get方法使用二级缓存问题

阅读更多

网上很多言论都说load会使用二级缓存而get不会,包括一些hibernate的教材上也这么写的,但是以前在测试中发现,其实get也会使用二级缓存。
很久以前就发现了这个问题,一直没腾出时间研究,今天特意看了下源码(3.2.6.ga),确实如此

先看一下Session的默认实现SessionImpl
get方法会转到fireLoad,loadType的值是LoadEventListener.GET
load方法也是转到fireLoad,不同的是loadType的值是LoadEventListener.LOAD

Java代码  收藏代码
  1. private   void  fireLoad(LoadEvent event, LoadType loadType) {  
  2.     errorIfClosed();  
  3.     checkTransactionSynchStatus();  
  4.     LoadEventListener[] loadEventListener = listeners.getLoadEventListeners();  
  5.     for  (  int  i =  0 ; i < loadEventListener.length; i++ ) {  
  6.         loadEventListener[i].onLoad(event, loadType);  
  7.     }  
  8. }  
private void fireLoad(LoadEvent event, LoadType loadType) {
	errorIfClosed();
	checkTransactionSynchStatus();
	LoadEventListener[] loadEventListener = listeners.getLoadEventListeners();
	for ( int i = 0; i < loadEventListener.length; i++ ) {
		loadEventListener[i].onLoad(event, loadType);
	}
}

 调用loadEventListener的onLoad方法
LoadEventListener的默认实现DefaultLoadEventListener中
最终会转到doLoad方法,options就是前面的loadType

Java代码  收藏代码
  1. protected  Object doLoad(  
  2.             final  LoadEvent event,  
  3.             final  EntityPersister persister,  
  4.             final  EntityKey keyToLoad,  
  5.             final  LoadEventListener.LoadType options)  throws  HibernateException {  
  6.     。。。。。。  
  7.     Object entity = loadFromSessionCache( event, keyToLoad, options );//从一级缓存加载   
  8.     //如果不为空,直接返回   
  9.     。。。。。。  
  10.     entity = loadFromSecondLevelCache(event, persister, options);//从二级缓存加载   
  11.     。。。。。。  
  12. }  
protected Object doLoad(
			final LoadEvent event,
			final EntityPersister persister,
			final EntityKey keyToLoad,
			final LoadEventListener.LoadType options) throws HibernateException {
	。。。。。。
	Object entity = loadFromSessionCache( event, keyToLoad, options );//从一级缓存加载
	//如果不为空,直接返回
	。。。。。。
	entity = loadFromSecondLevelCache(event, persister, options);//从二级缓存加载
	。。。。。。
}

 loadFromSecondLevelCache即是从二级缓存中查找对象
get和load的区别在于LoadEventListener.LoadType options参数,一个是LoadEventListener.GET,一个是LoadEventListener.LOAD
而在这个方法中,并没有用到options参数
也就是说get和load使用二级缓存的状况是一样的,get也会使用二级缓存

分享到:
评论

相关推荐

    hibernate 3中的缓存小结

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...

    hibernate基础教程

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

    hibernate get load区别

    get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库

    hibernate session.doc

    此外,只有当调用Session的close()方法时,才会从Session的缓存中删除该对象。 例如以下代码先加载一个持久化对象,然后通过delete()方法将它删除: Session session1 = sessionFactory.openSession(); Transaction ...

    hibernate操作数据库笔记

    //该方法会延迟加载/获取数据(只有使用该对象中的字段时才会向数据库发出查询语句),该方法会在内部和二级缓存中查找数据,当数据库中没有要查询的数据时报ObjectNotFoundException异常 (7).createQuery(String HQL)...

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

     22.4.4 Session与第二级缓存的交互模式  22.5 运行本章的范例程序  22.6 小结  22.7 思考题 第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  ...

    test-hibernate:了解一级缓存的工作原理

    示例 3 - 添加新实体并将其从一级缓存中删除。 示例 4 - 更新会话中已存在具有相同标识符的实体的非 Hibernate 受管实体。 示例 4a - 使用session.merge(..)更新非 Hibernate 托管实体。 示例 5 - 删除会话中已存在...

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

     22.4.4 Session与第二级缓存的交互模式  22.5 运行本章的范例程序  22.6 小结  22.7 思考题 第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  ...

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

     22.4.4 Session与第二级缓存的交互模式  22.5 运行本章的范例程序  22.6 小结  22.7 思考题 第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  ...

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

     22.4.4 Session与第二级缓存的交互模式  22.5 运行本章的范例程序  22.6 小结  22.7 思考题 第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  ...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...

    精通Hibernate:对象持久化技术第二版part3

    处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...

    hibernate总结

    c) 从一个持久态对象转化过来的,从session的一级缓存中出来的,因为调用了session的一些方法,产生了这种对象(session.close()) SessionFctory: Hibernate映射一对多...

    ssh(structs,spring,hibernate)框架中的上传下载

     以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。  工程...

    低清版 大型门户网站是这样炼成的.pdf

    5.1.5 使用session的get()方法 274 5.1.6 使用session的load()方法 275 5.1.7 使用session的save()方法 275 5.1.8 使用session的update()方法 276 5.1.9 使用session的saveorupdate()方法 276 5.1.10 使用...

    jdbc基础和参考

    脏检查:自动对缓存中的数据进行检查,并且选择在合适的时机和数据库之间进行交互,以保持数据的一致性 延迟加载:从数据库中还原对象的时候,不会立即对对象进行初始化,而是等到用到的时候才会进行初始化 Core:...

    java面试题

    82. 异常的使用方法 98 83. JAVA代码查错 101 83.1. 判断 101 83.2. 判断 102 83.3. 判断 102 83.4. 判断 102 83.5. 判断 102 83.6. 判断 103 83.7. 判断 103 83.8. 判断 103 83.9. 判断 104 83.10. 判断 104 83.11....

    从J2SE到J2EE知识点介绍

    3. 关于jsp在MyEclipse中打开的乱码问题 138 4. 关于html页面在eclipse中打开出现乱码情况 139 5. JSP页面通过URL传递中文参数的乱码问题 139 四、 Struts2 140 (一) 基于struts2的web应用的开发步骤 140 1. MVC设计...

    Java常见面试题208道.docx

    130.说一下 mybatis 的一级缓存和二级缓存? 131.mybatis 和 hibernate 的区别有哪些? 132.mybatis 有哪些执行器(Executor)? 133.mybatis 分页插件的实现原理是什么? 134.mybatis 如何编写一个自定义插件? 十...

Global site tag (gtag.js) - Google Analytics