一. 我们使用oscache来演示 , 引入oscache的jar包到工程中.
伦理片 http://www.dotdy.com/
二. 把下载的Hibernate压缩包中的 hibernate-3.2\etc\oscache.properties放入classpath中. 用默认设置就行了.
三.修改hibernate.cfg.xml , 加入如下, 意思启用二级缓存, 指定使用OSCache这个实现.
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory >
- <property name="show_sql">true</property>
- <property name="hibernate.hbm2ddl.auto">update</property>
- <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="hibernate.connection.url">jdbc:mysql:///test</property>
- <property name="hibernate.connection.username">root</property>
- <property name="hibernate.connection.password">1234</property>
- <!-- 这行不写也行,默认就为true-->
- <property name="cache.use_second_level_cache">true</property>
- <!-- 对Query也开启缓存 ,由于命中率太低,建议不开 -->
- <property name="cache.use_query_cache">true</property>
- <!-- 指定使用OSCache这个实现-->
- <property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
- <!-- 打开统计信息-->
- <property name="generate_statistics">true</property>
- <mapping resource="dao/po/Department.hbm.xml"/>
- <mapping resource="dao/po/Employee.hbm.xml"/>
- <mapping resource="dao/po/Person.hbm.xml"/>
- <mapping resource="dao/po/IdCard.hbm.xml"/>
- <mapping resource="dao/po/Teacher.hbm.xml"/>
- <mapping resource="dao/po/Student.hbm.xml"/>
- <mapping resource="dao/po/User.hbm.xml"/>
- <mapping resource="extends_test/extends_1/Person.hbm.xml"/>
- <mapping resource="extends_test/extends_2/Person.hbm.xml"/>
- <mapping resource="extends_test/extends_4/Person.hbm.xml"/>
- <!-- 以下类被缓存-->
- <class-cache class="dao.po.Person" usage="read-write"/>
- </session-factory>
- </hibernate-configuration>
四.usage的说明
"read-only" 只读的, po不能修改, 修改会抛异常
"read-write" 可对PO读写. 不怕并发修改
"nonstrict-read-write" 非严格的 读写, 并发修改不会问题, 一般用在能容忍出问题的环境.
"transactional" 有事务的,缓存 , oscache不是支持, jboss 有实现.
五. 查询测试, 看看命中几次
- package cache_test;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.stat.Statistics;
- import dao.HibernateUtil;
- import dao.po.Person;
- /**
- * 测试缓存
- *
- */
- public class Test
- {
- public static void main(final String[] args)
- {
- query();
- final SessionFactory sf = HibernateUtil.getSessionFactory();
- final Statistics s = sf.getStatistics();
- System.out.println(s); //打印所有信息 监测SessionFactory
- System.out.println("---------------");
- System.out.println("放入:" + s.getSecondLevelCachePutCount()); //打印缓存的信息
- System.out.println("命中:" + s.getSecondLevelCacheHitCount());
- System.out.println("丢失:" + s.getSecondLevelCacheMissCount());
- }
- public static void query()
- {
- Session session = null;
- for (int i = 0; i < 10; i++)
- {
- session = HibernateUtil.getSeesion();
- final Person p1 = (Person) session.get(Person.class, 1);
- session.close();
- System.out.println(p1.getName());
- }
- }
- }
六: 打印出:
放入:1
命中:9
丢失:1