hibernate的二级缓存



这里讨论二级缓存

@Cacheable是用在实体类上的,且是在JPA中体现的。如果只是用spring+hibernate的情况,要用诸如@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)在实体类上

当实体类上有@Cache时,还要在hibernate中开启 hibernate.cache.use_second_level_cache。

如果使用JPA,那么在jpa配置文件中使用<prop key="javax.persistence.sharedCache.mode">ALL</prop>就不用使用@Cacheable了。

如果要开启查询缓存,那么就要在配置文件中添加hibernate.cache.use_query_cache为true

hibernate中(非JPA)中使用查询缓存不仅要添加<property name="hibernate.cache.use_query_cache">false</property>

还要调用query.setCacheable(true);

先一级,然后二级,最后数据库

list方法对二级缓存不生效,要用查询缓存

要用查询缓存,一定要将二级缓存开启,查询缓存里面是对象ID,二级缓存里面是对象

如果list查询实体对象,那么如果开启查询缓存,不开启二级缓存,那么存储的是对象ID,但对应的对象没有二级缓存,所以会根据ID去发送sql语句。如果开启了二级缓存,那么就会根据ID从二级缓存中去找对象

list方法会缓存中存放数据但不会从缓存的读取数据,就是说两次list会发两次sql,但怎么理解会存放数据呢?就是说使用list方法后,然后调用 session.get(XXX.class,id);不会发sql语句

query.uniqueResult()同list方法,也是存放数据但不会从缓存的读取数据,两次uniqueResult()会发两次sql,但调用uniqueResult()后再调用 session.get(XXX.class,id);不会发sql语句

使用HibernateTemplate即BaseDaoImpl<T> extends HibernateDaoSupport,HibernateDaoSupport中依赖了HibernateTemplate,用它的方法时,他如果获取不到当前session,就会openNewSession,但这个session是只读的,不能使用增删改。所以如果用增删改,还得在service层使用@Transactional


这里讨论二级缓存

@Cacheable是用在实体类上的,且是在JPA中体现的。如果只是用spring+hibernate的情况,要用诸如@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)在实体类上

当实体类上有@Cache时,还要在hibernate中开启 hibernate.cache.use_second_level_cache。

如果使用JPA,那么在jpa配置文件中使用<prop key="javax.persistence.sharedCache.mode">ALL</prop>就不用使用@Cacheable了。

如果要开启查询缓存,那么就要在配置文件中添加hibernate.cache.use_query_cache为true

hibernate中(非JPA)中使用查询缓存不仅要添加<property name="hibernate.cache.use_query_cache">false</property>

还要调用query.setCacheable(true);

先一级,然后二级,最后数据库

list方法对二级缓存不生效,要用查询缓存

要用查询缓存,一定要将二级缓存开启,查询缓存里面是对象ID,二级缓存里面是对象

如果list查询实体对象,那么如果开启查询缓存,不开启二级缓存,那么存储的是对象ID,但对应的对象没有二级缓存,所以会根据ID去发送sql语句。如果开启了二级缓存,那么就会根据ID从二级缓存中去找对象

list方法会缓存中存放数据但不会从缓存的读取数据,就是说两次list会发两次sql,但怎么理解会存放数据呢?就是说使用list方法后,然后调用 session.get(XXX.class,id);不会发sql语句

query.uniqueResult()同list方法,也是存放数据但不会从缓存的读取数据,两次uniqueResult()会发两次sql,但调用uniqueResult()后再调用 session.get(XXX.class,id);不会发sql语句

使用HibernateTemplate即BaseDaoImpl<T> extends HibernateDaoSupport,HibernateDaoSupport中依赖了HibernateTemplate,用它的方法时,他如果获取不到当前session,就会openNewSession,但这个session是只读的,不能使用增删改。所以如果用增删改,还得在service层使用@Transactional


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值