验证Hibernate二级缓存的存在[通俗易懂]

验证Hibernate二级缓存的存在[通俗易懂]一、环境的搭建请参考EHcache环境的配置二、实体类(Student.java)packagecom.hibernate.beans;publicclassStudent{privateIntegerid;privateStringname;privateintage;privatedoublescore;publicStu

大家好,又见面了,我是你们的朋友全栈君。

一、环境的搭建

请参考EHcache环境的配置

二、实体类(Student.java)

package com.hibernate.beans;

public class Student { 
   

    private Integer id;
    private String name;
    private int age;
    private double score;
    public Student() {
        super();
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }
    public Student(String name, int age, double score) {
        super();
        this.name = name;
        this.age = age;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age
                + ", score=" + score + "]";
    }

    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
}

三、映射文件(Student.hbm.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package="com.hibernate.beans">
     <class name="Student" table="t_student">
        <id name="id" column="t_id">
            <!-- 主键生成策略 -->
            <generator class="native"></generator>
        </id>
        <property name="name" column="t_name"></property>
        <property name="age" column="t_age"></property>
        <property name="score" column="t_score"></property>
     </class>
 </hibernate-mapping>

四、主配置文件(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>
    <!--DB连接四要素 Ctrl shift C -->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF8</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">123456</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <!-- 数据源:数据库连接池 -->
    <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
    <!-- 当前session的上下文 保证在同一线程中获取到的是同一个session-->
    <property name="hibernate.current_session_context_class">thread</property>
    <!-- 自动建表-->
    <property name="hibernate.hbm2ddl.auto">update</property>
    <!-- 显示SQL -->
    <property name="hibernate.show_sql">true</property>
    <!-- 格式化SQL -->
    <property name="hibernate.format_sql">true</property>


    <!-- 开启二级缓存 -->
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <!-- 注册二级缓存区域工厂 -->
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
    <!-- 加载映射文件 -->
    <mapping resource="com/hibernate/beans/Student.hbm.xml"/>
    <!-- 配置缓存类 -->
    <class-cache usage="read-only" class="com.hibernate.beans.Student"/>
    <!-- 配置缓存集合 <collection-cache usage="read-only" collection="com.hibernate.beans.Student.name"/> -->
    </session-factory>
</hibernate-configuration>

五、测试代码
------

public void testEHcache(){
        //获取session
        Session session = HbnUtils.getSession();
        try {
            //开启事务
            session.beginTransaction();
            //第一次执行get操作
            Student student = session.get(Student.class, 1);
            System.out.println(student);
            //第二次执行get操作
            Student student1 = session.get(Student.class, 1);
            System.out.println(student1);
            //清除session缓存
            session.clear();

            //第三次执行get操作
            Student student2 = session.get(Student.class, 1);
            System.out.println(student2);
            //提交事务
            session.getTransaction().commit();
        } catch (Exception e) {
            //回滚事务
            session.getTransaction().rollback();
        }
    }

结果

 select
        student0_.t_id as t_id1_0_0_,
        student0_.t_name as t_name2_0_0_,
        student0_.t_age as t_age3_0_0_,
        student0_.t_score as t_score4_0_0_ 
    from
        t_student student0_ 
    where
        student0_.t_id=?
Student [id=1, name=李四, age=20, score=90.0]
Student [id=1, name=李四, age=20, score=90.0]
Student [id=1, name=李四, age=20, score=90.0]

分析

日志上的sql语句是第一次查询出现了,

第一次输出的详情是从数据库中加载来的,

第二次输出的详情是从session缓存中读取的,

然后session缓存被清空,

第三次输出的详情就只能是从二级缓存中读取的了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142426.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月10日 下午12:20
下一篇 2022年5月10日 下午12:40


相关推荐

  • 云存储性能_内存256g和128g的区别

    云存储性能_内存256g和128g的区别与以磁盘存储为主的普通数据库相比,内存数据库的数据访问速度可以高出几个数量级,能大幅提高运算性能,更适合高并发、低延时的业务场景。不过,当前大部分内存数据库仍然采用SQL模型,而SQL缺乏一些必要的数据类型和运算,不能充分利用内存的特征实现某些高性能算法。仅仅是把外存的数据和运算简单地搬进内存,固然也能获得比外存好得多的性能,但还没有充分利用内存特征,也就不能获得极致的性能。下面我们来看看,有哪些适合内存特征的算法和存储机制,可以进一步提升内存数据库计算速度。我们知道,内存可以通过地址(指针)来访问

    2025年8月14日
    5
  • 最优投资组合的确定matlab,最优投资组合问题的数学模型

    最优投资组合的确定matlab,最优投资组合问题的数学模型李成博 宓颖 衣国洋 黄小宇摘要 本文研究的是投资者在 1 年内 不考虑交易费的情况下 对市场资产 如股票 债券 进行选择 并优化所选投资 从而获得最优投资组合 以实现投资目标的问题 首先 运用马柯维茨均值 方差模型建立针对市场上 n 种资产的最优投资组合模型 其次 运用 Excel 对所给股票数据进行随机抽样 根据在问题 1 给出的最优投资组合模型 求解出投资组合的有效前沿 最后确定最优投资组合的投资项目

    2026年3月26日
    1
  • 机器学习—决策树原理(python代码实现)

    机器学习—决策树原理(python代码实现)首先,决策树(DecisionTree)是一种基本的分类与回归方法,在这里主要讨论用于分类的决策树。决策树的学习通常包含三个步骤:特征选择,决策树的生成,决策树的剪枝。优点:计算复杂度不高,输出结果易于理解,对中间值的缺失值不敏感,可以处理不相关特征数据。 缺点:可能会产生过度匹配的问题。 使用数据类型:数值型和标称型。那么具体的来通过一个例子说明一下决策树。下面这个例子是通过贷款…

    2025年10月3日
    5
  • 你有网站吗_有些网站进不去怎么办

    你有网站吗_有些网站进不去怎么办1.最强大的“免费电子书”下载区——新浪电子书共享http://ishare.iask.sina.com.cn/(数十万册哦,全是免费滴!)2.性能很好的免费网络硬盘——云盘网(10G免费超大空间哦,支持共享,可加密文件)http://www.diskes.com/3.爱酷美剧(一边看美剧,一边学英语,不耽误啊!)http://www.icoolen.com/film4.传说中“天涯第一镇山神贴”!!!(先说明白了。机子配置低的不要点开。会死机的。镇山贴可不是开玩笑的,配置低的,直接卡死在外面,配置

    2022年10月2日
    8
  • Unicode编码转换器

    Unicode编码转换器nbsp nbsp nbsp nbsp 今天在看一个项目的 properties 文件时 看到里面全部都是这种字符 gerenListXLS u666e u901a u7528 u6237 u8ba2 u5355 u5217 u8868 xls 其实 properties 文件中不能写中文字符 要不会出现乱码 必须将中文进行 Unicode 编码 nbsp nbsp nbsp nbsp 常

    2026年3月17日
    2
  • python中random函数的用法_python中的随机函数random的用法示例random

    python中random函数的用法_python中的随机函数random的用法示例random篇文章主要介绍了python中的随机函数random的用法示例,详细的介绍了python随机函数random的用法和实例。一、random模块简介Python标准库中的random函数,可以生成随机浮点数、整数、字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等。二、random模块重要函数1、random()返回0…

    2022年5月26日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号