<ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> </ehcache>
3)设置hbm
对于要进行二级缓存的实体类,进行配置,增加
1:事务(Transaction)仅在受管理的环境中可用。它保证可重读的事务隔离级别,可以对读/写比例高,很少更新的数据采用该策略。
2:读写(read-write)使用时间戳机制维护读写提交事务隔离级别。可以对读/写比例高,很少更新的数据采用该策略。
3:非严格读写(notstrict-read-write)不保证Cache和数据库之间的数据库的一致性。使用此策略时,应该设置足够的缓存过期时间,否则可能从缓存中读出脏数据。当一些数据极少改变,并且当这些数据和数据库有一部份不量影响不大时,可以使用此策略。
4:只读(read-only)当确保数据永不改变时,可以使用此策略。
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.domain"> <class name="Category" table="category"> <cache usage="read-write" /><!-- 二级缓存配置 --> <id name="id" column="id"> <generator class="native"> </generator> </id> <property name="name" column="name"/> </class> </hibernate-mapping>
4)测试效果
使用不同的session,都去获取id=1的category,只会访问一次数据库。因为第二次获取虽然没有从第二个session中拿到缓存,但是从sessionfactory中拿到了Category缓存对象。
log1 Hibernate: select category0_.id as id1_0_, category0_.name as name1_0_ from category category0_ where category0_.id=? log2 log3
//一级缓存session System.out.println("log1"); Category c1 = (Category)session.get(Category.class, 1); System.out.println("log2"); Category c2 = (Category)session.get(Category.class, 1);//不会显示SQL语句 //提交事务 session.getTransaction().commit(); //二级缓存SessionFactory Session session2 = factory.openSession(); session2.beginTransaction(); System.out.println("log3"); Category p3 = (Category) session2.get(Category.class, 1);//会显示 session2.getTransaction().commit();
5)注意事项
maven所需包,hibernate 3.0版本,hibernate-ehcache
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.10.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>3.6.7.Final</version> </dependency>