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

查询缓存是比二级缓存功能更强大的缓存.必须把二级缓存配置好之后才能用查询缓存,否则是用不了的.二级缓存主要是对类的缓存/对象缓存.查询缓存针对对象也是可以的(因为功能比二级缓存更强大),而且还可以针对类中的属性.

select cname from Customer.这种二级缓存是缓存不了的.二级缓存只能缓存的是整个的对象.而我们查询缓存里面可以缓存对象的属性.这是查询缓存与二级缓存最大的区别.

    @Test
    // 查询缓存的测试
    public void demo9(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        //from Customer然后.list()已经证明可以往二级缓存放数据了,像这种已经没有什么意义了.
        Query query = session.createQuery("select c.cname from Customer c");//缓存的是对象的属性.二级缓存无法缓存对象的属性.
        //查询某些字段必须得使用查询缓存才能提升你的效率了.
        // 使用查询缓存:
        query.setCacheable(true);
        query.list();//如果你直接query.list(),那它是缓存不了的.

        tx.commit();

        session = HibernateUtils.getCurrentSession();
        tx = session.beginTransaction();

        query = session.createQuery("select c.cname from Customer c");
        query.setCacheable(true);
        query.list();

        tx.commit();
    }
<?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:///hibernate3_day03
    </property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password"></property>
    <!-- Hibernate的方言 -->
    <!-- 生成底层SQL不同的 -->
    <property name="hibernate.dialect">
        org.hibernate.dialect.MySQLDialect
    </property>

    <!-- 可选的属性 -->
    <!-- 显示SQL -->
    <property name="hibernate.show_sql">true</property>
    <!-- 格式化SQL -->
    <property name="hibernate.format_sql">true</property>

    <property name="hibernate.connection.autocommit">false</property>
    <!-- hbm:映射 to DDL: create drop alter -->
    <property name="hibernate.hbm2ddl.auto">update</property>
    <!-- 设置事务的隔离级别 -->
    <property name="hibernate.connection.isolation">4</property>
    <!-- 设置本地Session -->
    <property name="hibernate.current_session_context_class">thread</property>

    <!-- C3P0连接池设定-->
    <!-- 使用c3po连接池  配置连接池提供的供应商-->
    <property name="connection.provider_class">
        org.hibernate.connection.C3P0ConnectionProvider
    </property>
    <!-- Hibernate中开启二级缓存 -->
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <!-- 配置二级缓存的提供商 -->
    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
    <!-- 配置查询缓存 -->
    <property name="hibernate.cache.use_query_cache">true</property>

    <!--在连接池中可用的数据库连接的最少数目 -->
    <property name="c3p0.min_size">5</property>
    <!--在连接池中所有数据库连接的最大数目  -->
    <property name="c3p0.max_size">20</property>
    <!--设定数据库连接的过期时间,以秒为单位,
        如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
    <property name="c3p0.timeout">120</property>
    <!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
    <property name="c3p0.idle_test_period">3000</property>

    <!-- 通知Hibernate加载那些映射文件 -->
    <mapping resource="cn/itcast/hibernate3/demo1/Customer.hbm.xml" />
    <mapping resource="cn/itcast/hibernate3/demo1/Order.hbm.xml" />

    <!-- 配置哪些类使用二级缓存 -->
    <class-cache usage="read-write" class="cn.itcast.hibernate3.demo1.Customer"/>
    <!--查询订单的类缓存区-->

    <class-cache usage="read-write" class="cn.itcast.hibernate3.demo1.Order"/>

    <!-- 集合缓冲区
    所以在获得客户的订单的数量的时候,就没有再去发送SQL语句了。因为它已经把我们的集合orders也给缓存了。集合缓存区用来缓存对象中的集合。
    我们现在用的就是对象中的集合,所以它没有发送SQL语句。证明集合缓存区的数据是依赖于类缓存区的。
    -->

    <collection-cache usage="read-write" collection="cn.itcast.hibernate3.demo1.Customer.orders"/>

</session-factory>
</hibernate-configuration>

    <!-- 配置查询缓存 -->
    <property name="hibernate.cache.use_query_cache">true</property>

时间: 2024-10-12 21:09:56

day37 07-Hibernate二级缓存:查询缓存的相关文章

hibernate回顾之缓存机制-一级缓存、二级缓存、查询缓存

在介绍hibernate的缓存机制前,我们先了解一下什么是缓存: 缓存(Cache): 计算机领域非常通用的概念.里面放东西,说白了缓存就是一个集合.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数据是数据存储源中数据的拷贝并且缓存的物理介质通常是内存. 了解jdbc的人都知道,当需要连接数据库时,一般都会做一个连接池,那么连接池和缓存有什么区别呢? 相同点:两者都可以是在内存里,实现时一样的

Hibernate 利用缓存(一级、二级、查询)提高系统性能

在hibernate中我们最常用的有三类缓存,分别为一级缓存.二级缓存和查询缓存,下面我们对这三个缓存在项目中的使用以及优缺点分析一下. 缓存它的作用在于提高性能系统性能,介于应用系统与数据库之间而存在于内存或磁盘上的数据. 首先,来看一下一级缓存它默认开启且很常用. 一级缓存 同是一种缓存常常可以有好几个名字,这是从不同的角度考虑的结果,从缓存的生命周期角度来看一级缓存又可以叫做:sessin缓存.线程级缓存.事务级缓存.我们编程中线程.事务.session这三个概念是绑定到一起的放到了thr

hibernate 一级缓存,二级缓存,查询缓存

1.一级缓存是session级的缓存,session结束即事务提交,session关闭,缓存清除.效果不大 get方式:一个session内,第二次查询不连数据库.适用于一级缓存 load方式:懒加载查询(查询时不执行sql,使用结果时才会执行sql),第二次查询不连数据库.适用于一级缓存 createQuery(hql).list():查询了整个list,第一次调用list()时,执行sql.第二次查询时,又执行了sql,说明不使用一级缓存.也就是不使用二级缓存    createQuery(

Hibernate二级缓存以及ehcache的搭建配置

前言 这次主要复习Hibernate的二级缓存的相关知识,配置以及使用.二级缓存主要采用第三方的ehcache,也将介绍ehcache缓存的相关配置属性以及在项目中的搭建,具体的项目查看下一篇的 Maven搭建SpringMVC+Hibernate项目详解 的文章.(之前使用过Hibernate的二级缓存,但是没自己搭建和研究过,现在花了半天时间搭建了一下,写下来供大家参考) 1.Hibernate二级缓存 Hibernate包括两个级别的缓存: 1.一级缓存:默认总是启用的session级别的

Hibernate二级缓存的使用

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

Hibernate学习---第十五节:hibernate二级缓存

1.二级缓存所需要的 jar 包 这三个 jar 包实在 hibernate 解压缩文件夹的 lib\optional\ehcache 目录下 2.配置 ehcache.xml <ehcache> <!-- 指定当缓存数据超出规定缓存大小的时候,超出的缓存数据写入到磁盘的位置 --> <diskStore path="D:/cache/tmp"/> <!-- maxInMemory - 允许在二级缓存中的持久化对象数量 eternal - 缓存

Hibernate中延迟加载和缓存

什么是延迟加载? 延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象 访问该对象的属性时才会加载出相应的值.简答来说就是尽可能的减少查询的数据量. 如何配置延迟加载 在Hibernate中通过.hbm配置文件中的lazy属性来陪值,并且lazy属性出现的位置不同其作用和取值也不同.下面来详细介绍其在不同位置的不同取值和作用 类Class标签中的lazy: 在类标签Clas

在Spring、Hibernate中使用Ehcache缓存(2)

这里将介绍在Hibernate中使用查询缓存.一级缓存.二级缓存,整合Spring在HibernateTemplate中使用查询缓存.,这里是hibernate3,使用hibernate4类似,不过不用hibernatetemplate,直接        Query query = getSession().createQuery(hql);        //开启二级缓存        query.setCacheable(true); EhCache是Hibernate的二级缓存技术之一,

mybatis学习笔记(14)-查询缓存之中的一个级缓存

mybatis学习笔记(14)-查询缓存之中的一个级缓存 mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 本文主要讲mybatis的一级缓存.一级缓存是SqlSession级别的缓存. 查询缓存 mybatis提供查询缓存.用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时须要构造sqlSession对象,在对象中有一个数据结构(HashMa