2011-04-12 118 views
0

我想知道如何加载和获得第一级高速缓存。休眠第一级高速缓存

如果我在同一个会话中有一个select查询,首先使用getmethod进行检索,然后使用load方法。第二个加载方法会使用查询缓存还是会对属性的检索进行新的查询?

回答

3

缓存是主要适用于:

  • 调用session.get
  • 调用session.load
  • 时(懒惰)加载许多-to-one和一到一个关系

如果没有命中,则get执行查询,load创建代理。

执行任何类型的查询(HQL,条件)时,查询将转换为SQL并在数据库上执行。如果在缓存中找到结果对象,则查询将返回它们。

0

我是新手来休眠。因此,为了理解hibernate缓存策略,我在get处设置了一个断点,然后跟随了调用堆栈。

在文件StatefulPersistanceContext.java中, entitiesByKey,它充当会话级缓存。当你打电话给get()它首先检查会话级别缓存,如果它未命中,那么检查第二级缓存(如果它被设置为用于该实体)否则它会回退到数据库。见doLoad()功能和调用loadFromSessionCache()loadFromSecondLevelCache()loadFromDatasource()在DefaultLoadEventListners.java文件

一旦从数据库中检索行,它也会填充会话级别缓存。因此,您对get()的后续调用将从会话级高速缓存本身解析。

0

默认情况下启用一级缓存,我们不需要做任何事情来实现它,实际上我们甚至不能从那里禁用它。第一级缓存也被称为会话级缓存,这意味着它仅适用于会话,以防单个会话中执行两次或更多次相同的查询,它仅从第一个请求获取数据,并提供相同的数据从缓存中为所有即将到来的类似请求

更多细节:http://www.beingjavaguys.com/2014/11/how-first-level-caching-works-in.html