hibernate二级缓存
二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享
二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存
二级缓存的配置和使用:
* 将echcache.xml文件拷贝到src下
* 开启二级缓存,修改hibernate.cfg.xml文件(其实默认就是开启的)
<property name="hibernate.cache.use_second_level_cache">true</property>
* 指定缓存产品提供商,修改hibernate.cfg.xml文件
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
* 指定那些实体类使用二级缓存(两种方法)
* 在映射文件中采用<cache>标签(放在ID标签前面)
* 在hibernate.cfg.xml文件中,采用<class-cache>标签(推荐使用这个方法)
二级缓存是缓存实体对象的
了解一级缓存和二级缓存的交互
=======================================================
一 级缓存是伴随着session一起的,session消亡了,对应的一级缓存也就没有了,而二级缓存则不一样,不同的session是可以共享二级缓存 的!下面的程序,如果没有开启二级缓存,则会发两次sql,但开启后只会发一次,如果将下面的load换成get效果也是一样的
二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享
二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存
二级缓存的配置和使用:
* 将echcache.xml文件拷贝到src下
* 开启二级缓存,修改hibernate.cfg.xml文件(其实默认就是开启的)
<property name="hibernate.cache.use_second_level_cache">true</property>
* 指定缓存产品提供商,修改hibernate.cfg.xml文件
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
* 指定那些实体类使用二级缓存(两种方法)
* 在映射文件中采用<cache>标签(放在ID标签前面)
* 在hibernate.cfg.xml文件中,采用<class-cache>标签(推荐使用这个方法)
二级缓存是缓存实体对象的
了解一级缓存和二级缓存的交互
=======================================================
一 级缓存是伴随着session一起的,session消亡了,对应的一级缓存也就没有了,而二级缓存则不一样,不同的session是可以共享二级缓存 的!下面的程序,如果没有开启二级缓存,则会发两次sql,但开启后只会发一次,如果将下面的load换成get效果也是一样的
- /**
- * 开启两个session,分别调用load,(get和load也一样)
- */
- public void testCache1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- //get和load也一样
- Student student = (Student)session.load(Student.class, 1);
- System.out.println("student.name=" + student.getName());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- //不会发出sql,因为开启了二级缓存,session是共享二级缓存的
- Student student = (Student)session.load(Student.class, 1);
- System.out.println("student.name=" + student.getName());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- ================================================================
- /**
- * 开启两个session,分别调用load,在使用SessionFactory清除二级缓存
- */
- public void testCache3() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- Student student = (Student)session.load(Student.class, 1);
- System.out.println("student.name=" + student.getName());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- //管理二级缓存
- SessionFactory factory = HibernateUtils.getSessionFactory();
- //factory.evict(Student.class); 在这种情况下,会将所有的二级缓存全部清除,下面的只会清除指定的
- factory.evict(Student.class, 1);
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- //会发出查询sql,因为二级缓存中的数据被清除了
- Student student = (Student)session.load(Student.class, 1);
- System.out.println("student.name=" + student.getName());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- /**
- * 一级缓存和二级缓存的交互
- */
- public void testCache4() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- //仅向二级缓存读数据,而不向二级缓存写数据
- session.setCacheMode(CacheMode.GET);
- Student student = (Student)session.load(Student.class, 1);
- System.out.println("student.name=" + student.getName());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- //发出sql语句,因为session设置了CacheMode为GET,所以二级缓存中没有数据
- Student student = (Student)session.load(Student.class, 1);
- System.out.println("student.name=" + student.getName());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- //只向二级缓存写数据,而不从二级缓存读数据
- // 如果此处不设置cachemode,但它不会发Sql因为上一个已经存了数据,它已经放到了二级缓存中,
- //默认的情况下,是可以读取的,貌似此处的每一次设置cachemode只针对当前的session有效??
- session.setCacheMode(CacheMode.PUT);
- //会发出查询sql,因为session将CacheMode设置成了PUT
- Student student = (Student)session.load(Student.class, 1);
- System.out.println("student.name=" + student.getName());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- }