缓存设计原理:
第一次查询的时候需要查询数据库,把查询的结果放到一个Map中。
第二次查询的时候直接查Map,如果Map中有此数据,就直接用此数据,如果没有再放到Map中。
Hibernate的缓存分为两级:
一级缓存是Session级别的缓存。
二级缓存是SessionFactory级别的缓存。
一、一级缓存(Session级别):
一级缓存默认是开启的。
一级缓存在Session关闭的时候就会消失,在Session还没关闭之前一级缓存默认存在。
即:作用范围在Session开启和关闭之间。范围很小。
Session的save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会把对象放在一级缓存中。一级缓存不能控制缓存的数量,所以当大批量操作数据时可能会造成内存溢出。可以使用session.evict(object),session.clear()方法清除缓存中的内容。
Query,Criteria这两个接口查询数据时,不会使用一级缓存。
二、二级缓存(SessionFactory):
Hibernate将二级缓存交给了第三方来开发。
二级缓存生命周期长。
二级缓存需要在Hibernate的配置文件中来配置。
Session的save(不适合native生成主键),update,saveOrUpdate,list,iteraror,get,load,以及Query,Criteria都会填充二级缓存
1、设置是否需要打开二级缓存(默认为真):hibernate.cache.use_second_level_cache
值包括:
true
false
2、第三方缓存的提供者:hibernate.cache.provider_class
值包括:
org.hibernate.cache.EhCacheProvider
org.hibernate.cache.EmptyCacheProvider
org.hibernate.cache.HashtableCacheProvider
org.hibernate.cache.TreeCacheProvider
org.hibernate.cache.OSCacheProvider (较多使用)
org.hibernate.cache.SwarmCacheProvider
因为有了第三方缓存的提供者,因此在使用二级缓存时,Hibernate就可以不再去配置缓存的大小等等参数。可以由第三方缓存提供者通过配置文件来提供。
3、在Hibernate的配置文件中使用<class-cache class="" usage="">来配置对哪些类进行二级缓存。
4、Query二级缓存查询配置(默认是打开的):hibernate.cache.use_query_cache
值包括:
true
false