`
freeroy
  • 浏览: 74653 次
  • 性别: 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二级缓存实例

    总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...

    Hibernate二级缓存

    Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...

    Hibernate二级缓存技术

    // 第二次查询,由于开启了查询缓存,应该直接从缓存中获取数据 session.getCache().evictRegion("Entity"); criteria = session.createCriteria(Entity.class); entities = criteria.list(); // 输出查询结果...

    二级缓存配置

    1. **加载实体**:当通过`session.get()`或`session.load()`方法加载实体时,Hibernate首先检查二级缓存,然后是一级缓存,最后才是数据库。 2. **更新实体**:当对实体进行修改时,如果启用了`read-write`缓存策略...

    Hibernate(session管理)

    当对象被加载或保存时,它们会被放入这个缓存中。同一Session内的多次查询可以避免重复的数据库访问,提高了性能。 7. **二级缓存**:一级缓存虽然有效,但其作用范围仅限于一个Session。为了跨Session共享数据,...

    hibernate+oscache实现二级缓存实例

    例如,当从数据库查询一个实体时,如果它已经在缓存中,那么Hibernate将直接从缓存中获取,而不是去数据库查询: ```java SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session = ...

    hibernate3.2_GET方法

    6. **性能考虑**:GET方法的行为可能会受到缓存的影响,作者可能会讨论一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),以及它们如何影响GET操作的性能。 7. **最佳实践**:最后,作者可能...

    模拟hibernate中一级缓存

    当我们在应用程序中通过Hibernate的Session接口进行增删改查操作时,这些对象会被暂时存储在一级缓存中。这样做的好处在于减少了对数据库的直接访问,提高了数据读取的速度,同时也降低了数据库的压力。 一级缓存的...

    J2EE企业级项目开发-1期 05 hibernate二级缓存实战经验.doc

    当我们通过`Session.get()`检索一个对象时,Hibernate首先检查一级缓存(即Session内部的缓存),如果不在一级缓存中,那么会尝试从二级缓存中查找。如果二级缓存也没有,Hibernate才会去数据库中查询。在这个测试中...

    Hibernate一级缓存和二级缓存详解

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

    hibernate和session学习

    同时,为了优化性能,Hibernate还提供了二级缓存,可以通过配置将频繁访问的数据存储在内存中,减少对数据库的访问。 总结来说,Hibernate简化了Java应用与数据库之间的交互,通过`SessionFactory`和`Session`的...

    重写hibernate的session简单增删改查

    在Hibernate中,增加数据通常通过调用Session的save()或saveOrUpdate()方法来实现。save()用于新对象的保存,如果对象已经有了ID,那么它将被更新。saveOrUpdate()会根据对象是否存在数据库中决定是插入还是更新。 ...

    使用Hibernate缓存数据.ppt

    - **操作行为**:当调用Session的`get()`、`load()`、`save()`、`update()`、`saveOrUpdate()`、`Query`或`Criteria`的`list()`、`iterate()`等方法时,Hibernate会自动处理一级缓存。 - **查询示例**:在同一个...

    hibernate缓存的问题

    二级缓存需要正确配置才能生效,并且在进行条件查询时,需要使用特定方法如Query.iterate()、load、get等来从缓存中获取数据。 一级缓存存在的问题在于其生命周期与Session绑定,导致命中率较低。为提高性能,通常...

    SSH框架网上商城项目第16战之Hibernate二级缓存处理首页热门显示

    对于session中的操作,如`save()`、`get()`和`load()`,它们默认支持二级缓存,其中`read-only`配置对session是有效的。然而,`update()`和`delete()`在`read-only`模式下会失败。对于HQL的`list()`查询,它会直接从...

    Hibernate缓存,性能优化

    当会话关闭时,一级缓存中的数据会被清除。一级缓存的主要作用是减少对数据库的查询次数,提高应用程序的响应速度。 二级缓存是一种可选的缓存策略,用于在不同的会话之间共享数据。它通常由第三方缓存提供者(如...

    实现自己的Hibernate框架之Session 方法实现

    4. **缓存机制**:二级缓存可以提高性能,Session应该支持缓存策略配置,如读写缓存、查询缓存等。 5. **对象关系映射**:将Java对象转换为SQL语句,以及将数据库结果集映射回Java对象,这需要解析配置文件或注解来...

Global site tag (gtag.js) - Google Analytics