Hibernate缓存机制
Hibernate一级缓存
通过Session从数据库查询实体时会把实体在内存中存储起来,下一次查询同
一实体时不再从数据库获取,而从内存中获取,且同一个对象
一级缓存的生命周期与Session相同
一级缓存的数据只能用于当前会话内
相关API:
evict(object):清除指定对象
clear():清除所有缓存
Hibernate二级缓存
二级缓存在每个session中可共用
1.二级缓存的配置
导入jar包
3.在hibernate.cfg.xml
<!-- 指定二级缓存的实现类 -->
<property name="cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
4.在实体类的配置文件中进行配置
<cache usage="read-only" />
Hibernate一级缓存
通过Session从数据库查询实体时会把实体在内存中存储起来,下一次查询同
一实体时不再从数据库获取,而从内存中获取,且同一个对象
一级缓存的生命周期与Session相同
一级缓存的数据只能用于当前会话内
相关API:
evict(object):清除指定对象
clear():清除所有缓存
Hibernate二级缓存
二级缓存在每个session中可共用
1.二级缓存的配置
导入jar包
2.添加ehcache配置文件
<ehcache>
<!-- Sets the path to the directory where cache .data files are created.
If the path is a Java System Property it is replaced by
its value in the running VM.
The following properties are translated:
user.home - User's home directory
user.dir - User's current working directory
java.io.tmpdir - Default temp file path -->
<!--
指定一个目录:当 EHCache 把数据写到硬盘上时, 将把数据写到这个目录下.
-->
<diskStore path="d:\\tempDirectory"/>
<!--Default Cache configuration. These will applied to caches programmatically created through
the CacheManager.
The following attributes are required for defaultCache:
maxInMemory - Sets the maximum number of objects that will be created in memory
eternal - Sets whether elements are eternal. If eternal, timeouts are ignored and the element
is never expired.
timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
if the element is not eternal. Idle time is now - last accessed time
timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
if the element is not eternal. TTL is now - creation time
overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache
has reached the maxInMemory limit.
-->
<!--
设置缓存的默认数据过期策略
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
<!--
设定具体的命名缓存的数据过期策略。每个命名缓存代表一个缓存区域
缓存区域(region):一个具有名称的缓存块,可以给每一个缓存块设置不同的缓存策略。
如果没有设置任何的缓存区域,则所有被缓存的对象,都将使用默认的缓存策略。即:<defaultCache.../>
Hibernate 在不同的缓存区域保存不同的类/集合。
对于类而言,区域的名称是类名。如:com.atguigu.domain.Customer
对于集合而言,区域的名称是类名加属性名。如com.atguigu.domain.Customer.orders
-->
<!--
name: 设置缓存的名字,它的取值为类的全限定名或类的集合的名字
maxElementsInMemory: 设置基于内存的缓存中可存放的对象最大数目
eternal: 设置对象是否为永久的, true表示永不过期,
此时将忽略timeToIdleSeconds 和 timeToLiveSeconds属性; 默认值是false
timeToIdleSeconds:设置对象空闲最长时间,以秒为单位, 超过这个时间,对象过期。
当对象过期时,EHCache会把它从缓存中清除。如果此值为0,表示对象可以无限期地处于空闲状态。
timeToLiveSeconds:设置对象生存最长时间,超过这个时间,对象过期。
如果此值为0,表示对象可以无限期地存在于缓存中. 该属性值必须大于或等于 timeToIdleSeconds 属性值
overflowToDisk:设置基于内存的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中
-->
<cache name="com.atguigu.hibernate.entities.Employee"
maxElementsInMemory="1"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
<cache name="com.atguigu.hibernate.entities.Department.emps"
maxElementsInMemory="1000"
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
/>
</ehcache>
3.在hibernate.cfg.xml
<!-- 指定二级缓存的实现类 -->
<property name="cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
4.在实体类的配置文件中进行配置
<cache usage="read-only" />