一般我们自己做一个简单对象缓存机制的话,我肯定会用一个Map,map中保存的key使用类名+id的形式。hibernate提供的二级缓存的实现内部为HashtableCacheProvider,但是在生产环节最好不要用它。
hibernate中对缓存的封装非常严实,其提供的缓存分为两级:
一级缓存:
基于session级的缓存,save,updata,saveorUpdata,load,get,list等操作后的对象都会放入一级缓存,但是session以及缓存存在弊端,因为当我们用户提交一个请求时,服务器会为该请求分发一个线程,并把事务操作绑定到当前线程上面,当我们的操作完毕事务关闭后,session的一级缓存也会跟着消失,一个session一个缓存,这样就导致一级缓存不长久,不能共享。再者,一级缓存中没有使用任何的保护,我们可以一直往里面添加数据,一直到内存的溢出,我们不能控制缓存的数量,假如我们一个劲的使用一级缓存,那么为了保证安全,我们应该及时的清理一级缓存。
二级缓存:
基于sessionFactory级别的缓存,二级缓存有很多框架可以实现,要做一个严谨的缓存有一定的难度,hibernate应用中一般把二级缓存的管理交给第三方的框架来处理,但是hibernate也提供了二级缓存的实现,但是它内部为HashtableCacheProvider来实现的,下面简单的介绍一下二级缓存的简单配置。
首先开启二级缓存,明确用哪个框架来实现,我们这里用osCacheProvider。
hibernate.cache.use_second_level_cache = true
hibernate.cache.provider_class = org.hibernate.cache.OSCacheProvider
hibernate.generate_statistics = true
<class-cache class="类的全名" usage="read-only"/>
还可以在映射文件中写入
<cache usage="read-only"/>