hibernate缓存可以分为一级缓存和二级缓存,一级缓存就是session级别的,只能为单个session共享,这是hibernate自己带的无需我们配置就可以使用。
sessionFactory缓存可以根据功能和目的的不同划分为内置缓存和外置缓存:
1、sessionFactory内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的副本,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推到出来的。内置缓存是只读的,应用程序不能修改映射元数据和预定义的SQL语句,因此,sessionFactory不需要进行内置缓存与映射文件的同步。
2、外置缓存是一个可配置的插件,在默认情况下,sessionFactory不会启用这个插件,外置缓存的数据是数据库数据的副本,外置缓存的介质是内存或者硬盘,sessionFactory的外置缓存也被成为hibernate的二级缓存。
Hibernate的缓存都是以ID为key的map来实现对对象的缓存,Hibernate的二级缓存作用级别是sessionFactory,可以被所用session所共享。
二级缓存工作原来:
1、在执行各种查询条件时,如果所获得的结果集是实体对象的集合,那么就会把所有对的对象根据ID放入到二级缓存中。
2、当Hibernate根据ID访问数据对象的时候,首先会从session的一级缓存中找,如果找不到并且配置了二级缓存,就会从二级缓存中找,如果还找不到就查数据库。
在默认情况下Hibernate会使用EHCache作为二级缓存组件,但是可以通过hibernate.cache.provider_class属性制定其他的缓存策略。
二级缓存配置步骤:
1、在hibernate.cfg.xml文件中配置二级缓存相关配置
<!-- 配置Hibernate的二级缓存, -->
<!-- 开启查询缓存 -->
<property name="cache.use_query_cache">true</property>
<!-- 开启二级缓存 -->
<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_structured_entries">true</property>
<property name="cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>
<property name="net.sf.ehcache.configurationResourceName">ehcache.xml</property>
2、在hibernate.cfg.xml统计目录下创建eacache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../main/config/ehcache.xsd" name="tc"
updateCheck="false">
<!--maxElementsInMemory 缓存最大个数
eternal:对象是否永久有效,一但设置了,timeout将不起作用
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷 大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除
-->
<defaultCache
maxElementsInMemory="1000"
eternal="true"
overflowToDisk="false">
</defaultCache>
</ehcache>
3、在映射文件中加入<!-- 给具体实体类使用二级缓存--><cache usage="read-only"/>
<class name="Person" table="person">
<!-- 给具体实体类使用二级缓存-->
<cache usage="read-only"/>
<id name="id">
<generator class="native"/>
</id>
<property name="name" />
<property name="team" />
<property name="age" />
<property name="position" />
<property name="worth" />
</class>
二级缓存配置 成功,注意:在配置过程中可能会出现各种各样的错误,出现错误首先检查你的hibernate包的版本是否一致,如果配置不成功那么就换个版本试试,所有问题都是可以解决的。