要使用 Ehcache:需要下步骤
path添加相应jar(ehcachecommons-logging)
2然后在hibernate.cfg.xml中配置
<property name="cache.provider_">org.hibernate.cache.EhCacheProvider</property>
<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_query_cache">true</property>
介绍说明:如果没有配置<property name="cache.use_second_level_cache">true</property>(默认false) 将会产生根据单个id查询情况(产生很多sql)
3为需要缓存Cache类添加缓存Cache标示:
使用mapping文件时需要添加node :
Java代码
@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
如果使用使用hibernate annoation是使用@Cache(usage=CacheConcurrencyStrategy.)标签有5种可选缓存Cache方案:
1CacheConcurrencyStrategy.NONE
不适用默认
2. CacheConcurrencyStrategy.NONSTRICT_READ_WRITE
更新不频繁几个小时或更长
3CacheConcurrencyStrategy.READ_ONLY
对于不发生改变数据使用
4CacheConcurrencyStrategy.READ_WRITE
基于时间戳判定机制对于数据同步要求严格情况使用频繁
5CacheConcurrencyStrategy.TRANSACTIONAL
运行在jta环境种基于事务
4在path下添加ehcache.xml
写道
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000" <!-- 缓存Cache最大数目 -->
eternal="false" <!-- 缓存Cache是否持久 -->
overflowToDisk="true" <!-- 是否保存到磁盘当系统当机时-->
timeToIdleSeconds="300" <!-- 当缓存Cache闲置n秒后销毁 -->
timeToLiveSeconds="180" <!-- 当缓存Cache存活n秒后销毁-->
diskPersistent="false"
diskExpiryThreadIntervalSeconds= "120"/>
</ehcache>
测试:
Java代码
@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
public B {
private id;
private String bname;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public getId {
id;
}
public String getBname {
bname;
}
...
}
并配置到cfg文件中:<mapping ="com.eric.po.B" />
思路方法:
Java代码
public void (String args) throws Exception {
getTest;
getTest;
}
Java代码
public void getTest throws Exception {
Session session = HibernateSessionFactory.getSession;
Query q = session.createQuery("from B where id>?");
q.Parameter(0, 10);
q.Cacheable(true); 需要设置此属性
List list = q.list;
for (Iterator iterator = list.iterator; iterator.hasNext;) {
B a2 = (B) iterator.next;
.out.pr(a2.getId + "/");
}
HibernateSessionFactory.closeSession;
}
控制台信息:
Java代码
Hibernate: select b0_.id as id1_, b0_.bname as bname1_ from B b0_ where b0_.id>?
11/14/18/25/26/27/28/29/Hibernate: select b0_.id as id1_, b0_.bname as bname1_ from B b0_ where b0_.id>?
11/14/18/25/26/27/28/29/
只发出了次sql 第 2次从缓存Cache中取
我们配置我们自己缓存Cache文件:
Java代码
<cache name="cache_a"
maxElementsInMemory="5"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
我们将maxElementsInMemory设置小点 我们就可以看见磁盘缓存Cache文件:
首先介绍说明:我们在ehcache.xml <diskStore path="java.io.tmpdir"/>配置了缓存Cache溢出到磁盘路径
可以通过:
Java代码
.out.prln(.getProperty("java.io.tmpdir"));
查询
测试代码:
Java代码
public void (String args) throws Exception {
Java代码
.out.prln(.getProperty("java.io.tmpdir"));
getTest;
getTest;
Thread.sleep(10000);
Java代码
}
我们在最后暂停10秒来查看磁盘文件
Java代码
public void getTest throws Exception {
Session session = HibernateSessionFactory.getSession;
Query q = session.createQuery("from B where id>?");
q.Parameter(0, 10);
q.Cacheable(true);
q.CacheRegion("cache_a");//使用我们自己配置缓存Cache
List list = q.list;
for (Iterator iterator = list.iterator; iterator.hasNext;) {
B a2 = (B) iterator.next;
.out.pr(a2.getId + "/");
}
HibernateSessionFactory.closeSession;
}
控制台信息:
Java代码
C:\DOCUME~1\eric\LOCALS~1\Temp\ //我java.io.tmpdir
Hibernate: select b0_.id as id1_, b0_.bname as bname1_ from B b0_ where b0_.id>?
11/14/18/25/26/27/28/29/Hibernate: select b0_.id as id1_, b0_.bname as bname1_ from B b0_ where b0_.id>?
11/14/18/25/26/27/28/29/
查看磁盘信息:
Java代码
在文件按目录下有下文件:
com.eric.po.B.data--------0kb
cache_a.data ------------4 kb
org.hibernate.cache.StandardQueryCache.data ---0kb
org.hibernate.cache.UpdateTimestampsCache.data -----0kb
其中 cache_a中保存了我们缓存Cache文件
StandardQueryCache.data 则是 设置默认查询缓存Cache数据过期策略 产生文件
org.hibernate.cache.UpdateTimestampsCache.data则是 设置时间戳缓存Cache数据过期策略
如果不适用我们自己缓存Cache配置就会使用类类全路径路径文件(com.eric.po.B.data)来缓存Cache我们数据
最新评论