这里讨论二级缓存
@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