本文共 2870 字,大约阅读时间需要 9 分钟。
如果想要使用其他厂商提供的缓存,就要在上面做好配置: 这里我们使用EhCacheProvider这个二级缓存org.hibernate.cache.NoCacheProvider
EhCacheProvider自己也有一个配置文件:(这个配置文件在hibernate包下的project/etc/ehcache.xml)true org.hibernate.cache.EhCacheProvider
讲二级缓存是为了应付面试的,工作中,除非必要,一般是不用二级缓存的。 有必要用二级缓存的场景: 1.经常被访问的 2.改动不大,不会经常被改动 3.数量有限 二级缓存的使用,利用注解(不是jpa的注解,是hibernate的)eternal="false" timeToIdleSeconds="12" timeToLiveSeconds="120" overflowToDisk="true" /> maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" />
@Cache( (1)CacheConcurrencyStrategy usage(); (2)String region() default ""; (3)String include() default "all";)例如:
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)NONSTRICT_READ_WRITE说的是非严格读写 READ_ONLY是只读(在二级缓存里不允许改) READ_WRITE是既能读又能改 region()是对应的缓存策略名称,不填就默认使用default 使用的时候别忘了引入ehcache的jar包:ehcache-1.5.0.jar 加入ehcache的配置文件ehcache.xml之后,在category类上加注解:
package com.bjsxt.hibernate;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import org.hibernate.annotations.BatchSize;import org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;@Entity@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)public class Category { private int id; private String name; @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }}之后进行测试:
@Testpublic void testHuanCun2(){ Session session = sf.openSession(); session.beginTransaction(); Category c=(Category)session.load(Category.class,1); System.out.println(c.getName()); session.getTransaction().commit(); session.close(); Session session2 = sf.openSession(); session2.beginTransaction(); Category c2=(Category)session2.load(Category.class,1); System.out.println(c2.getName()); session2.getTransaction().commit(); session2.close();}测试结果: Hibernate: select category0_.id as id0_0_, category0_.name as name0_0_ from Category category0_ where category0_.id=? c0 c0
发现第二次去缓存中去取了
转载请注明出处: