二级缓存 对数据查询

二级缓存:存放公有数据

1、适用场合:

1、数据不能频繁更新

2、数据能公开,私密性不是很强

2、hibernate本身并没有提供二级缓存的解决方案

3、二级缓存的实现是依赖于第三方供应商完成的

ehcache

oscache

jbosscache

swamchache

4、二级缓存的操作

1、二级缓存存在sessionFactory中

2、生命周期:与sessionFactory保持一致

3、使用二级缓存的步骤

1、在hibernate.cfg.xml

<property name="cache.use_second_level_cache">true</property>

<property name="cache.provider_class">

org.hibernate.cache.EhCacheProvider

</property>

2、让某一个对象进入到二级缓存中(以下选一种配置方式,推荐第二种)

* 在配置文件中

<class-cache usage="read-only" class="cn.itcast.hiberate.sh.domain.Classes"/>

*  在映射文件中

<cache usage="read-only"/>

3、使用

session.get/session.load

5、查询缓存

在二级缓存的基础上 在cfg.xml加上

     <property name="cache.use_query_cache">true</property>,只能在session.createQuery()中使用

示例:

hibernate.cfg.xml

 1 <?xml version=‘1.0‘ encoding=‘utf-8‘?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 5 <hibernate-configuration>
 6     <!--
 7         一个session-factory只能连接一个数据库
 8     -->
 9 <session-factory>
10     <!--
11         数据库的用户名
12     -->
13     <property name="connection.username">root</property>
14     <!--
15         密码
16     -->
17     <property name="connection.password">root</property>
18     <!--
19         url
20     -->
21     <property name="connection.url">
22         jdbc:mysql://localhost:3306/itcast_sh_hibernate
23     </property>
24     <!--
25         作用:根据持久化类和映射文件生成表
26         validate
27         create-drop
28         create
29         update
30     -->
31     <property name="hbm2ddl.auto">update</property>
32     <!--
33         显示hibernate内部生成的sql语句
34     -->
35     <property name="show_sql">true</property>
36     <property name="format_sql">true</property>
37     <!--
38         告诉hibernate,session由当前线程产生
39     -->
40     <property name="current_session_context_class">thread</property>
41
42     <!--
43         开启二级缓存
44     -->
45     <property name="cache.use_second_level_cache">true</property>
46
47     <!--
48         二级缓存的提供商
49     -->
50     <property name="cache.provider_class">
51         org.hibernate.cache.EhCacheProvider
52     </property>    <!--查询缓存,用于createQuery代码-->
53     <property name="cache.use_query_cache">true</property>
54
55     <mapping resource="cn/itcast/hiberate/sh/domain/Classes.hbm.xml" />
56
57     <!--
58         <class-cache usage="read-only" class="cn.itcast.hiberate.sh.domain.Classes"/>
59     -->
60 </session-factory>
61 </hibernate-configuration>

Classes.java

 1 package cn.itcast.hiberate.sh.domain;
 2
 3 import java.io.Serializable;
 4 import java.util.Set;
 5
 6 public class Classes implements Serializable{
 7     private Long cid;
 8     private String cname;
 9     private String description;
10
11     public Long getCid() {
12         return cid;
13     }
14
15     public void setCid(Long cid) {
16         this.cid = cid;
17     }
18
19     public String getCname() {
20         return cname;
21     }
22
23     public void setCname(String cname) {
24         this.cname = cname;
25     }
26
27     public String getDescription() {
28         return description;
29     }
30
31     public void setDescription(String description) {
32         this.description = description;
33     }
34
35     public Set<Student> getStudents() {
36         return students;
37     }
38
39     public void setStudents(Set<Student> students) {
40         this.students = students;
41     }
42
43     private Set students;
44 }

Classes.hbm.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <hibernate-mapping>
 5     <class name="cn.itcast.hiberate.sh.domain.Classes">
 6         <!--
 7             缓存策略
 8          -->
 9        <cache usage="read-write"/><!--对这个对象开启二级缓存 对于update测试用read-write  对查询的是read-only就可以了-->
10         <id name="cid" length="5" type="java.lang.Long">
11             <generator class="increment"></generator>
12         </id>
13         <property name="cname" length="20" type="java.lang.String"></property>
14
15         <property name="description" length="100" type="java.lang.String"></property>
16         <!--
17             set元素对应类中的set集合
18             通过set元素使classes表与student表建立关联
19                key是通过外键的形式让两张表建立关联
20                one-to-many是通过类的形式让两个类建立关联
21
22             cascade 级联
23                save-update
24                    1、当 保存班级的时候,对学生进行怎么样的操作
25                         如果学生对象在数据库中没有对应的值,这个时候会执行save操作
26                         如果学生对象在数据库中有对应的值,这个时候会执行update操作
27                delete
28                all
29             inverse  维护关系
30                true      不维护关系
31                false     维护关系
32                default   false
33          -->
34         <set name="students" cascade="save-update" inverse="true" fetch="select">
35             <!--
36                 key是用来描述外键
37              -->
38             <key>
39                 <column name="cid"></column>
40             </key>
41             <one-to-many class="cn.itcast.hiberate.sh.domain.Student"/>
42         </set>
43     </class>
44 </hibernate-mapping>

测试

 1 package cn.itcast.hibernate.sh.test;
 2
 3 import java.util.List;
 4 import java.util.Set;
 5
 6 import org.hibernate.Session;
 7 import org.hibernate.Transaction;
 8 import org.junit.Test;
 9
10 import cn.itcast.hiberate.sh.domain.Classes;
11 import cn.itcast.hiberate.sh.domain.Student;
12 import cn.itcast.hibernate.sh.utils.HiberanteUtils;
13
14 public class SecondCacheTest extends HiberanteUtils{
15     static{
16         url = "hibernate.cfg.xml";
17     }
18
19     /**
20      * session.get
21      *    把数据存在一级缓存和二级缓存
22      */
23     @Test
24     public void testGet(){
25         Session session = sessionFactory.openSession();
26         Classes classes = (Classes)session.get(Classes.class, 1L);  //放入一级缓存 并且放入二级缓存
27         session.close();                          //关闭了一级缓存了
28         session = sessionFactory.openSession();
29         classes = (Classes)session.get(Classes.class, 1L);      //这个时候不发出查询语句,因为从二级缓存中查询了
30         session.close();
31     }
32
33     /**
34      * session.load
35      *   同上
36      */
37     @Test
38     public void testLoad(){                            //与get方法的情况是一样的
39         Session session = sessionFactory.openSession();
40         Classes classes = (Classes)session.load(Classes.class, 1L);
41         classes.getCname();
42         session.close();
43         session = sessionFactory.openSession();
44         classes = (Classes)session.load(Classes.class, 1L);
45         classes.getCname();
46         session.close();
47     }
48
49     /**
50      * session.update
51      */
52     @Test
53     public void testUpdate(){
54         Session session = sessionFactory.openSession();
55         //session.beginTransaction();
56         Classes classes = new Classes();
57         classes.setCid(1L);
58         classes.setCname("aaa");
59         session.update(classes);
60
61         session.close();
62         session = sessionFactory.openSession();
63         classes = (Classes)session.get(Classes.class, 1L);
64         session.close();
65     }    66 }

查询缓存的测试

 1 package cn.itcast.hibernate.sh.test;
 2
 3 import java.util.List;
 4 import java.util.Set;
 5
 6 import org.hibernate.Query;
 7 import org.hibernate.Session;
 8 import org.hibernate.Transaction;
 9 import org.junit.Test;
10
11 import cn.itcast.hiberate.sh.domain.Classes;
12 import cn.itcast.hiberate.sh.domain.Student;
13 import cn.itcast.hibernate.sh.utils.HiberanteUtils;
14
15 public class QueryCacheTest extends HiberanteUtils{
16     static{
17         url = "hibernate.cfg.xml";
18     }
19
20     @Test
21     public void testQuery(){
22         Session session = sessionFactory.openSession();
23         Query query = session.createQuery("from Classes");
24         query.setCacheable(true);//classes里的所有的数据要往查询缓存中存放了 打开
25         List<Classes> classesList = query.list();
26         query = session.createQuery("from Classes");  
27         query.setCacheable(true);        //打开查询缓存获取数据
28         classesList = query.list();
29         session.close();
30     }
31 }

二级缓存 对数据查询,布布扣,bubuko.com

时间: 2024-12-09 17:36:49

二级缓存 对数据查询的相关文章

Hibernate一级缓存、二级缓存以及查询缓存的关系

转载自http://blog.csdn.net/maoyeqiu/article/details/50209893 前两天总结了一下二级缓存和查询缓存的关系,但是又有一个新的问题,就是查询缓存缓存到二级缓存的数据,在第三次(第一次缓存中没有数据,查询数据库将对应的ID值存入到二级缓存中去,第二次如果是同一个Session那么将会把数据一级缓存中的数据返回,如果不是同一个Session而是同一个sessionfactory,那么将会把二级缓存中的数据返回,同时将数据放入到一级缓存中去)获取的时候,

day37 07-Hibernate二级缓存:查询缓存

查询缓存是比二级缓存功能更强大的缓存.必须把二级缓存配置好之后才能用查询缓存,否则是用不了的.二级缓存主要是对类的缓存/对象缓存.查询缓存针对对象也是可以的(因为功能比二级缓存更强大),而且还可以针对类中的属性. select cname from Customer.这种二级缓存是缓存不了的.二级缓存只能缓存的是整个的对象.而我们查询缓存里面可以缓存对象的属性.这是查询缓存与二级缓存最大的区别. @Test // 查询缓存的测试 public void demo9(){ Session sess

mybatis学习笔记(13)-查询缓存之二级缓存

mybatis学习笔记(13)-查询缓存之二级缓存 mybatis学习笔记13-查询缓存之二级缓存 二级缓存原理 开启二级缓存 调用pojo类实现序列化接口 测试方法 useCache配置 刷新缓存就是清空缓存 应用场景和局限性 本文主要讲mybatis的二级缓存,二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的. 二级缓存原理 首先开启mybatis的二级缓存. sqlS

Mybatis源码分析之Cache二级缓存原理 (五)

一:Cache类的介绍 讲解缓存之前我们需要先了解一下Cache接口以及实现MyBatis定义了一个org.apache.ibatis.cache.Cache接口作为其Cache提供者的SPI(ServiceProvider Interface) ,所有的MyBatis内部的Cache缓存,都应该实现这一接口 Cache的实现类中,Cache有不同的功能,每个功能独立,互不影响,则对于不同的Cache功能,这里使用了装饰者模式实现. 看下cache的实现类,如下图: 1.FIFOCache:先进

01-08-03【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之缓存管理

http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html 管理NHibernate二级缓存 NHibernate二级缓存由ISessionFactory创建并由ISessionFactory自行维护.我们使用NHibernate操作数据时,ISessionFactory能够自动同步缓存,保证缓存的有效性.但是当我们批量操作数据时,往往NHibernate不能维护缓存持久有效.ISessionFactory提供了可编程方式的缓存管理方法.

Hibernate之二级缓存

Hibernate缓存 缓存(Cache):计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数据时数据存储源中数据的拷贝.缓存的物理介质通常是内存 Hibernate中提供了两个级别的缓存 第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存.这一级别的缓存有Hibernate管理的 第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围的缓

Hibernate二级缓存的使用

1启用Hibernate二级缓存 Hibernate二级缓存分为两部分,class缓存和查询缓存,其获取对象的方式有所不同,但两者也有联系,查询缓存必须以class缓存为基础才能起作用,否则只会使效率更低. 我们这里使用的二级缓存是通过ehcache第三方插件实现的. 1.1配置Hibernate.cfg.xml 启用class缓存: <property name="hibernate.cache.provider_class"> org.hibernate.cache.E

hibernate缓存机制(二级缓存)

一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 二.what(Hibernate缓存原理是怎样的?)Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存. 1.Hibernate一级缓存又称为“Session的

使用Spring提供的缓存抽象机制整合EHCache为项目提供二级缓存

Spring自身并没有实现缓存解决方案,但是对缓存管理功能提供了声明式的支持,能够与多种流行的缓存实现进行集成. Spring Cache是作用在方法上的(不能理解为只注解在方法上),其核心思想是:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值存放在缓存中,等到下次利用同样的参数调用该方法时将不再执行该方法,而是直接从缓存中获取结果进行返回.所以在使用Spring Cache的时候我们要保证我们的缓存的方法对于相同的方法参数要有相同的返回结果. 1.适合和不适合保存到二级缓存的数