hibernate 一级缓存、二级缓存

一级缓存:——session一旦关掉就没有了。
使用 load和get加载对象的时候,会自动加载到缓存,读取的也会读缓存。

public void huancun(){
        Session session=null;
        try{
            session=HibernateUtil.getSession();

            Info data1=session.get(Info.class, "p003");
            Info data2 =session.get(Info.class, "p003");
            System.out.println(data1 == data2);

        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            HibernateUtil.closeSession();
        }
    }

生成了一条查询语句,返回的结果为true

第一次get()生成了语句,在数据库中生成了查询,第二次,hibernate会检索缓存中是否有该条数据,如果有,直接从缓存中取出该条数据,不再去数据库中查询

使用hql查询多条数据库,如果使用getResultList()默认是无法放到缓存中的。使用iterator()可以用在缓存中。

public void huancun(){
        Session session=null;
        try{
            session=HibernateUtil.getSession();
            //默认是无法放到缓存中的
            List<Info> list1 = session.createQuery("from Info").getResultList();
            List<Info> list2= session.createQuery("from Info").getResultList();

            System.out.println(list1 == list2);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            HibernateUtil.closeSession();
        }
    }

生成结果如下

说明并没有进行缓存,两次查询出的对象也并不是同一个对象

使用iterator迭代器,第一次查询会生成缓存,第二次查询时会先检索缓存中是否存在需要的数据

public void huancun(){
        Session session=null;
        try{
            session=HibernateUtil.getSession();

       //iterator()迭代器
            Iterator<Info> list1=session.createQuery("from Info").iterate();
            while(list1.hasNext()){
                System.out.println(list1.next().getName());
            }
            Iterator<Info> list2 = session.createQuery("from Info").iterate();
            while(list2.hasNext()){
                System.out.println(list2.next().getName());
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            HibernateUtil.closeSession();
        }
    }

生成结果如下

很明显的能看出,第一次查询时生成了sql语句,第二次没有,直接从缓存中将数据取出

Hibernate二级缓存:需要扩展外部插件。SessionFactory内的缓存。Session关了后,只要SessionFactory没有close,还可以使用缓存。

插件需要的3个jar包:

2.在hibernate.cfg.xml中配置,启动二级缓存

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/mydb?characterEncoding=GBK</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.show_sql">true</property>

        <!-- 配置缓存 -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheMessageLogger</property>
        <property name="hibernate.cache.use_query_cache">true</property>
        <!-- 结束 -->

        <mapping resource="com/maya/model/Family.hbm.xml"/>
        <mapping resource="com/maya/model/Info.hbm.xml"/>
        <mapping resource="com/maya/model/Nation.hbm.xml"/>
        <mapping resource="com/maya/model/Title.hbm.xml"/>
        <mapping resource="com/maya/model/Work.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

3.把ehcache.xml配置文件复制过来,放到hibernate框架生成的实体类映射文件同一文件夹下

4.在实体类的映射文件中,配置缓存

<?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">
<!-- Generated 2017-3-11 9:29:47 by Hibernate Tools 5.2.0.CR1 -->
<hibernate-mapping>
    <class name="com.maya.model.Info" table="info" catalog="mydb" optimistic-lock="version">
    <!-- <cache usage="read-write"/> 这句话一定要放在class下面的最前面  -->
     <cache usage="read-write"/>

        <id name="code" type="string">
            <column name="Code" length="50" />
            <generator class="assigned" />
        </id>
        <property name="name" type="string">
            <column name="Name" length="50" />
        </property>
        <property name="sex" type="java.lang.Boolean">
            <column name="Sex" />
        </property>
        <property name="nation" type="string">
            <column name="Nation" length="50" />
        </property>
        <property name="birthday" type="timestamp">
            <column name="Birthday" length="19" />
        </property>
    </class>
</hibernate-mapping>

配置完成后,如果使用load或get的时候,不需要其它操作,直接使用的二缓存,中间session关闭也没关系

时间: 2024-10-12 09:10:49

hibernate 一级缓存、二级缓存的相关文章

hibernate一级和二级缓存介绍

一级缓存Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存Hibernate一级缓存又称为"Session的缓存",它是内置的,不能被卸载(不能被卸载的意思就是这种缓存不具有可选性,必须有的功能,不可以取消session缓在第一级缓存中,持久化类的每个实例都具有唯一的OID存 .在缓存中的对象,具有持久性,session对象负责管理.一级缓存的优点是使用同一个session对象多次查询同一个数据对象,仅对数据库查询一次例如:session.load

【Hibernate】一级、二级缓存

本文讲述HIbernate中一级.二级缓存的概念以及如何使用. 一.大纲 2.什么是一级缓存 3.一级缓存示例展示 4.二级缓存以及示例展示 5.总结 二.什么是一级缓存 在hibernate中所谓的一级缓存就是session对象,但是一级缓存对提高性能的作用性并不是很大,其session主要的目的是管理实体对象的状态(临时.离线.持久化). 其缓存模型如下图: 三.一级缓存示例 3.1 查询(get,load, HQL) 3.1.1 get/load方法 @Test public void t

hibernate的一级和二级缓存

一级缓存就是Session级别的缓存,close后就没了. 二级缓存就是SessionFactory级别的缓存,全局缓存,要配置其他插件. 什么样的数据适合存放到第二级缓存中? 1.很少被修改的数据 2.不是很重要的数据,允许出现偶尔并发的数据 3.不会被并发访问的数据 4.参考数据 不适合存放到第二级缓存的数据? 1.经常被修改的数据 2.财务数据,绝对不允许出现并发 3.与其他应用共享的数据.         Hibernate的二级缓存策略的一般过程如下: 1) 条件查询的时候,总是发出一

hibernate的获取session的两方法比较,和通过id获取对象的比较,一级缓存二级缓存

opensession与currentsession的联系与区别 在同一个线程中opensession的session是不一样的,而currentsession获取的session是一样的,这就保证了线程的安全性.当然想要后者的session需要在配置文件中手动配置,另外我们可以写一个工具类来获得后者的session. get vs load 如果查询不到数据,get会会返回null但是不会报错 若果load查询不到数据,则会报错 get立即向db发送请求 ,如果你使用的是load查询数据,即使

hibernate中的二级缓存

二级缓存使用场景:不经常修改的数据,但是经常的访问的数据会放到缓存中去 一级缓存仅仅是session内部的缓存,用来存取sql语句,比如说连续调用两次相同参数的get方法,就是session缓存 二级缓存是sessiionFactory层面的缓存,即不同线程,不同程序之间的缓存 1.在hibernate.hbm.xml中加载配置 <property name="cache.provider_class">org.hibernate.cache.HashtableCacheP

具体解释Hibernate中的二级缓存

1.前言 这篇博客再前几篇博客的基础上来解说一下.Hibernate中的二级缓存.二级缓存是属于SessionFactory级别的缓存机制. 第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预.第二级别的缓存是SessionFactory级别的缓存.是属于进程范围的缓存. 2.Hibernate二级缓存 1.分类 二级缓存也分为了两种 内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把

详解Hibernate中的二级缓存

1.前言 这篇博客再前几篇博客的基础上来讲解一下,Hibernate中的二级缓存,二级缓存是属于SessionFactory级别的缓存机制.第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预.第二级别的缓存是SessionFactory级别的缓存,是属于进程范围的缓存. 2.Hibernate二级缓存 1.分类 二级缓存也分为了两种 内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把映

【11.0】Hibernate缓存机制(一级和二级缓存)

1.  一级缓存,二级缓存,查询缓存: 2.  一级缓存又称为session缓存.生命周期相同.周期较短.事务级别的缓存. get使用了一级缓存,用get查数据时,首先检查缓存中是否有该数据,如果有直接从缓存中取数据,如果没有再查询数据库,并且将数据放入缓存中. load也支持一级缓存.load还支持lazy.当load从数据库中查询数据后,也会将数据放入缓存. 3.  unique/list查询不会去查看缓存,但是list查询的实体对象将会放入缓存中. 4.  iterate会执行查询id的操

Mybatis一级、二级缓存

一级缓存 首先做一个测试,创建一个mapper配置文件和mapper接口,我这里用了最简单的查询来演示. <mapper namespace="cn.elinzhou.mybatisTest.mapper.UserMapper"> <select id="findUsers" resultType="cn.elinzhou.mybatisTest.pojo.User"> SELECT * FROM user </se

Hibernate+EhCache配置二级缓存

步骤: 第一步:加入ehcache.jar 第二步: 在src目录下新建一个文件,名为:ehcache.xml 第三步:在hibernate配置文件的<session-factory>下配置 配置的具体信息: ehcache.xml的具体配置: <?xml version="1.0" encoding="UTF-8"?> <!-- maxEntriesLocalHeap: 在内存中缓存的element的最大数目. maxEntriesL