博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate学习11——配置Hibernate二级缓存
阅读量:4623 次
发布时间:2019-06-09

本文共 6438 字,大约阅读时间需要 21 分钟。

一、缓存的概念:                                                

以空间换时间;
 
二、Hibernate缓存的分类:                                        
前面我们讲的缓存都是session缓存;也叫一级缓存;get,load等缓存都是内置的,一级缓存;
SessionFactory缓存,二级缓存;

 

这里以Class —— Student,1对多的关系(单向)来例子说明下:

Class.java:

package com.cy.model;public class Class {    private int id;    private String name;        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;    }        }
View Code

Student.java:

package com.cy.model;import com.cy.model.Class;public class Student {    private int id;    private String name;    private Class c;        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;    }    public Class getC() {        return c;    }    public void setC(Class c) {        this.c = c;    }        }
View Code

Class.hbm.xml:

View Code

Student.hbm.xml:

View Code

StudentTest.java:

package com.cy.service;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.cy.model.Class;import com.cy.util.HibernateUtil;public class StudentTest {    private SessionFactory sessionFactory=HibernateUtil.getSessionFactory();    private Session session;        @Before    public void setUp() throws Exception {        session=sessionFactory.openSession();         session.beginTransaction();    }    @After    public void tearDown() throws Exception {         session.getTransaction().commit();         session.close();    }        /**     * 同一个session中,同一个事务是有一级缓存的;     */    @Test    public void testCache1(){        Class c = (Class) session.get(Class.class, 1);        System.out.println(c.getName());                Class c2 = (Class) session.get(Class.class, 1);        System.out.println(c2.getName());        System.out.println(c == c2);                /*         *  Hibernate: select class0_.classId as classId1_0_0_, class0_.className as classNam2_0_0_ from t_class class0_ where class0_.classId=?            08计算机本科            08计算机本科            true                        第一次取c1的时候,已经将取出来的数据c1放到缓存中。            第二次取c2的时候,是有session缓存的。首选从缓存中找,找到,直接从缓存中拿,而不到数据库中去取了。            两个是同一个OID对象;         */    }        /**     * 在不同的事务中,是否有缓存?     */    @Test    public void testCache2(){        Session session1 = sessionFactory.openSession();        session1.beginTransaction();        Class c = (Class) session1.get(Class.class, 1);        System.out.println(c.getName());        session1.getTransaction().commit();        session1.close();                        Session session2 = sessionFactory.openSession();        session2.beginTransaction();        Class c2 = (Class) session2.get(Class.class, 1);        System.out.println(c2.getName());        session2.getTransaction().commit();        session2.close();                System.out.println(c == c2);        /*         *  Hibernate: select class0_.classId as classId1_0_0_, class0_.className as classNam2_0_0_ from t_class class0_ where class0_.classId=?            08计算机本科            Hibernate: select class0_.classId as classId1_0_0_, class0_.className as classNam2_0_0_ from t_class class0_ where class0_.classId=?            08计算机本科            false                        虽然在同一个session中有缓存,但是这里新开辟了一个事务,发出两个sql            不同的事务是不能共用一级缓存的。            一级缓存只适用于同一个session,同一个事务;         */    }}
View Code

 

三、二级缓存策略提供商:                                          

配置ehcache二级缓存,让不同的session,不同的事务能共享数据。
要用到SessionFactory缓存了;
 
使用到的ehcache相关的jar包:

jar包在hibernate压缩包中:
hibernate-release-4.3.5.Final\lib\optional\ehcache
可以参考hibernate压缩包中的hibernate-ehcache的配置:
hibernate-release-4.3.5.Final\project\hibernate-ehcache\bin
hibernate-release-4.3.5.Final\project\hibernate-ehcache\bin\hibernate-config\ ehcache.xml 以及 hibernate.cfg.xml
 
代码实现:
1)ehcache.xml配置:
View Code

2)hibernate.cfg.xml中相关ehcache二级缓存的配置:

com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/hibernate
root
root
org.hibernate.dialect.MySQL5Dialect
true
update
true
org.hibernate.cache.ehcache.EhCacheRegionFactory
true
ehcache.xml

3)最后,Class.hbm.xml中配置使用cache:

4)测试代码:

/**     * 配置了二级缓存ehcache后,再次进行测试:     */    @Test    public void testCache3(){        Session session1 = sessionFactory.openSession();        session1.beginTransaction();        Class c = (Class) session1.get(Class.class, 1);        System.out.println(c.getName());        session1.getTransaction().commit();        session1.close();                        Session session2 = sessionFactory.openSession();        session2.beginTransaction();        Class c2 = (Class) session2.get(Class.class, 1);        System.out.println(c2.getName());        session2.getTransaction().commit();        session2.close();                System.out.println(c == c2);        /*         *  Hibernate: select class0_.classId as classId1_0_0_, class0_.className as classNam2_0_0_ from t_class class0_ where class0_.classId=?            08计算机本科            08计算机本科            false                        只有1条sql,说明在第2次查的时候,使用到了二级缓存。         */            }
View Code

 

 

四、什么数据适合放二级缓存中                                    

一般这些信息都是只读;不能修改;
 
 
 

转载于:https://www.cnblogs.com/tenWood/p/7259681.html

你可能感兴趣的文章
localStorage之本地储存
查看>>
Archlinux 交换左Ctrl和Cap键
查看>>
#openstack故障处理汇总
查看>>
搜索旋转排序数组 II
查看>>
20、docker swarm
查看>>
psp工具软件前景与范围文档
查看>>
day06-三元表达式
查看>>
C# DateTime.Now详细用法
查看>>
Php中"{}"大括号的用法总结(转)
查看>>
JavaScript内存优化
查看>>
BZOJ1059: [ZJOI2007]矩阵游戏(二分图匹配)
查看>>
P3385 【模板】负环
查看>>
URI、URL 和 URN的区别
查看>>
根据表达式序列(前缀、中缀、后缀)构建表达式树
查看>>
mysql性能优化
查看>>
【SqlServer系列】语法定义符号解析
查看>>
Color Length UVA - 1625
查看>>
TLS/SSL
查看>>
zoj2319Beautiful People Dp
查看>>
图片加载 背景色块问题
查看>>