hibernate一级缓存
hibernate一级缓存由Session提供,只存在与Session的生命周期
证明:连续两次get方法,只会打印出一次sql语句
如果关闭session,再调用get方法,就会又去查询数据库,因此会打印出sql语句
save() 然后再load() 不会打印sql语句
session.evict(o)清除对象
session.clear() 清除所有对象
hibernate二级缓存
hibernate二级缓存是通过配置二级缓存插件实现。常用二级缓存插件EHCache,OSCache,SwarmCache,JBossCache等
配置hibernate.cfg.xml
<!--配置二级缓存-->
<!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- 高速缓存提供程序 -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</property>
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<!-- 磁盘缓存位置 -->
<diskStore path="java.io.tmpdir/ehcache"/>
<!-- 默认缓存 -->
<defaultCache
maxEntriesLocalHeap="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<!-- helloworld缓存 -->
<!--
maxElementsInMemory=缓存对象的最大数目
eternal=是否永不过期
timeToIdleSeconds=对象处于空闲的最大秒数
timeToLiveSeconds=对象处于缓存状态的最大秒数
overflowToDisk=内存溢出时是否将溢出对象写入磁盘
-->
<cache name="simple"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="5"
timeToLiveSeconds="5"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>