Hibernate本身只提供了二级缓存的规范,但并未实现,所以需要第三方缓存插件的支持。常用的二级缓存第三方插件有:EHCache、Memcached、OSCache、SwarmCache、JBossCache。这些插件的功能的侧重均有所不同。下面一图说明了插件的在实际应用中的区别:
本例采用EHCache插件。
1、首先,导入需要EHCache插件相关的Jar包。(可通过Hibernate框架的lib\optional\ehcache目录中找到)
2、修改主配置文件hibernate.cfg.xml:
需要开启二级缓以及注册二级缓存工厂,在hibernate.cfg.xml文件中
3、添加配置文件ehcache.xml 。
解压ehcache-core-2.4.3.jar
找到ehcacha-failsafe.xml,将其复制到项目中的src目录中,并改名为ehcache.xml
4、再次修改在主配置文件(hibernate.cfg.xml),在主配置文件中指定缓存内容 。
在
5、以1:n的Country与Minister关联关系为例,演示二级缓存实例。首先,需要插入相关数据,在测试类中写插入数据的方法。
MyTest.java:
@Test public void test02() { Session session = HbnUtils.getSession(); try { session.getTransaction().begin(); Minister minister1 = new Minister("aaa"); Minister minister2 = new Minister("bbb"); Minister minister3 = new Minister("bbb"); Country country = new Country("America"); //Country维护关联关系 country.getMinisters().add(minister1); country.getMinisters().add(minister2); country.getMinisters().add(minister3);
session.save(country); session.getTransaction().commit(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); session.getTransaction().rollback(); } }
6、证明二级缓存的存在。为了证明二级缓存的存在,我这里是对插入的数据进行同样的3次查询。接着上例在MyTest.java中加入测试二级缓存的方法。
MyTest.java:
@Test public void test03() { Session session = HbnUtils.getSession(); try { session.beginTransaction(); //第一次查询,将id为1的country对象加载到一级缓存session将引发查询(select语句) Country country1 = session.get(Country.class, 1); System.out.println("第一次查询:Cname=" + country1.getCname());
//第二次查询:从session(一级缓存)中直接读取到的id为1的Country对象,不会到数据库中查询,不引发查询 Country country2 = session.get(Country.class, 1); System.out.println("第二次查询:Cname=" + country2.getCname()); //将一级缓存数据清空,session中Country对象也不存在了 session.clear();
//第三次查询,从二级缓存中读取id为1 的Country对象,不会到数据库中查询,不引发查询 Country country3 = session.get(Country.class, 1); System.out.println("第三次查询:Cname=" + country3.getCname()); session.getTransaction().commit(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); session.getTransaction().rollback(); } }
执行测试方法后,控制台显示如下结果:
明显可以看出,查询只引发了一次,并且是第一次查询所引发的。在第二次查询时,读取的是一级缓存session中的数据,所以不引发。当一级缓存数据被清空后,再次查询也是没有引发的,也就是说第三次查询是从二级缓存中获取的数据,也就证明是二级缓存的存在。