缓存:存储数据(使用频繁的数据)的临时地方
一级缓存:基于Session的缓存,同Session绑定,生命周期和Session相同。一级缓存的意义在于代码中所有对持久化对象的操作,只会在最后flush时,才会真正的发出更新数据库SQL的操作。
二级缓存:SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库;
Session产生方式:
二级缓存解决的问题:
Ø
什么样的数据适合存放到第二级缓存中?
很少被修改的数据
不是很重要的数据
不会被并发访问的数据
常量数据
Ø
不适合存放到第二级缓存的数据
经常被修改的数据
财务数据
与其他应用共享的数据
Ehcache配置
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
name:缓存名称。
maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
<pre class="java" name="code"><diskStore path="c:/temp"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
查询缓存
一级缓存与二级缓存都是对象缓存,会将数据库中每行的数据保存到一个对象中。。。‘查询缓存也叫数据缓存,需要多少数据(字段),就会查询多少数据放到缓存中,
开启查询缓存
在cfg中配置
<property name="hibernate.cache.use_query_cache">true</property>
代码中需要显式的调用setCacheable设置
createQuery1.setCacheable(true);
在cfg中配置
<property name="hibernate.cache.use_query_cache">true</property>
代码中需要显式的调用setCacheable设置
createQuery1.setCacheable(true);