一级缓存和二级缓存和査询缓存(面试题)
a) 什么是缓存
b) 什么是一级缓存,session级别的缓存
c) 什么是二级缓存,SessionFactory级别的缓存,可以跨越session存在
i. 经常被访间
ii. 改动不大不会经常改动
iii. 数重有限
d) 打开二级缓存
i. hibernate.cfg.xml 设定:
<property name= "cache.use_second_level_cache">true</property> <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
ii. @Cache注解(由hibernate扩展提供)
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
@Entity //@BatchSize(size=5) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class Category { private int id; private String name; 。。。。。。。。 }
注:使用EhCache二级缓存 需要导入ehcache-1.2.3.jar及commons-logging-1.0.4.jar包
e) load默认使用二级缓存,iterate默认使用二级缓存
f) list默认往二级缓存加数据,但是查询的时候不使用
g) 如果要query用二级缓存,需打开查询缓存
<property name="cache.use_query_cache">true</property>
调用Query的setCachable (true)方法指明使用二级缓存
例如:session.createQuery("from Category").setCacheable(true).list();
@Test public void testQueryCache() { Session session = sf.openSession(); session.beginTransaction(); List<Category> categories = (List<Category>)session.createQuery("from Category") .setCacheable(true).list(); session.getTransaction().commit(); session.close(); Session session2 = sf.openSession(); session2.beginTransaction(); List<Category> categories2 = (List<Category>)session2.createQuery("from Category") .setCacheable(true).list(); session2.getTransaction().commit(); session2.close(); }
h) 缓存算法:(纯为了面试)
i. LRU LFU FIFO
- Least Recently Used –最近很少被使用
- Least Frequently Used (命中率高低)
- First In First Out 按顺序替换
ii. memoryStoreEvictionPolicy = "LRU" (ehcache.xml中配置)