hibernateehcache:hibernate annoation(十一 缓存CacheEhcache 采用annoation)

  从hibernate2.1开始ehcache已经作为hibernate默认缓存Cache方案( 2级缓存Cache方案 sessionfactory级别) 在项目中有针对性使用缓存Cache将对性能提升右很大帮助

  要使用 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环境种基于事务

   4path下添加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我们数据



Tags:  hibernate二级缓存 hibernate缓存 二级缓存ehcache hibernateehcache

延伸阅读

最新评论

发表评论