网上很多言论都说load会使用二级缓存而get不会,包括一些hibernate的教材上也这么写的,但是以前在测试中发现,其实get也会使用二级缓存。
很久以前就发现了这个问题,一直没腾出时间研究,今天特意看了下源码(3.2.6.ga),确实如此
先看一下Session的默认实现SessionImpl
get方法会转到fireLoad,loadType的值是LoadEventListener.GET
load方法也是转到fireLoad,不同的是loadType的值是LoadEventListener.LOAD
-
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);
-
}
-
}
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
-
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);
-
。。。。。。
-
}
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二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...
Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...
// 第二次查询,由于开启了查询缓存,应该直接从缓存中获取数据 session.getCache().evictRegion("Entity"); criteria = session.createCriteria(Entity.class); entities = criteria.list(); // 输出查询结果...
1. **加载实体**:当通过`session.get()`或`session.load()`方法加载实体时,Hibernate首先检查二级缓存,然后是一级缓存,最后才是数据库。 2. **更新实体**:当对实体进行修改时,如果启用了`read-write`缓存策略...
当对象被加载或保存时,它们会被放入这个缓存中。同一Session内的多次查询可以避免重复的数据库访问,提高了性能。 7. **二级缓存**:一级缓存虽然有效,但其作用范围仅限于一个Session。为了跨Session共享数据,...
例如,当从数据库查询一个实体时,如果它已经在缓存中,那么Hibernate将直接从缓存中获取,而不是去数据库查询: ```java SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session = ...
6. **性能考虑**:GET方法的行为可能会受到缓存的影响,作者可能会讨论一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),以及它们如何影响GET操作的性能。 7. **最佳实践**:最后,作者可能...
当我们在应用程序中通过Hibernate的Session接口进行增删改查操作时,这些对象会被暂时存储在一级缓存中。这样做的好处在于减少了对数据库的直接访问,提高了数据读取的速度,同时也降低了数据库的压力。 一级缓存的...
当我们通过`Session.get()`检索一个对象时,Hibernate首先检查一级缓存(即Session内部的缓存),如果不在一级缓存中,那么会尝试从二级缓存中查找。如果二级缓存也没有,Hibernate才会去数据库中查询。在这个测试中...
当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到一级缓存...
同时,为了优化性能,Hibernate还提供了二级缓存,可以通过配置将频繁访问的数据存储在内存中,减少对数据库的访问。 总结来说,Hibernate简化了Java应用与数据库之间的交互,通过`SessionFactory`和`Session`的...
在Hibernate中,增加数据通常通过调用Session的save()或saveOrUpdate()方法来实现。save()用于新对象的保存,如果对象已经有了ID,那么它将被更新。saveOrUpdate()会根据对象是否存在数据库中决定是插入还是更新。 ...
- **操作行为**:当调用Session的`get()`、`load()`、`save()`、`update()`、`saveOrUpdate()`、`Query`或`Criteria`的`list()`、`iterate()`等方法时,Hibernate会自动处理一级缓存。 - **查询示例**:在同一个...
二级缓存需要正确配置才能生效,并且在进行条件查询时,需要使用特定方法如Query.iterate()、load、get等来从缓存中获取数据。 一级缓存存在的问题在于其生命周期与Session绑定,导致命中率较低。为提高性能,通常...
对于session中的操作,如`save()`、`get()`和`load()`,它们默认支持二级缓存,其中`read-only`配置对session是有效的。然而,`update()`和`delete()`在`read-only`模式下会失败。对于HQL的`list()`查询,它会直接从...
当会话关闭时,一级缓存中的数据会被清除。一级缓存的主要作用是减少对数据库的查询次数,提高应用程序的响应速度。 二级缓存是一种可选的缓存策略,用于在不同的会话之间共享数据。它通常由第三方缓存提供者(如...
4. **缓存机制**:二级缓存可以提高性能,Session应该支持缓存策略配置,如读写缓存、查询缓存等。 5. **对象关系映射**:将Java对象转换为SQL语句,以及将数据库结果集映射回Java对象,这需要解析配置文件或注解来...