posts - 2,  comments - 0,  trackbacks - 0

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

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

  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. }  

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

  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. }  

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

 

原文来自:http://snz.iteye.com/blog/305634

 

posted on 2012-02-28 12:37 wilsonyq 阅读(244) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: