验证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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript中window.open()和Window Location href的区别「建议收藏」

    JavaScript中window.open()和Window Location href的区别「建议收藏」目录1:window.location.href的用法:2:window.open()的用法3:window.open和window.location.href的区别1:区别2.window.open不一定是打开一个新窗口!!!!!!!!3:关于重新定位4.:在框架内指定页面打开连接5:是否打开其他网站地址6:window.open()经过设置后的弹…

    2022年7月12日
    22
  • Linux Socket 编程原理详解

    Linux Socket 编程原理详解不用多说,经典的TCP/IP三次握手及状态变迁图================================================================================================================函数:socket()–创建套接字,它会创建一个结构体及收发缓冲区。此时并不指定该套接字在哪个IP和PORT口上,bind()–用于将套接字绑定在特定的IP/PORT上listen()–用于为侦听端口创建两个队列(见上图

    2022年10月17日
    2
  • tail命令用法举例

    tail命令用法举例tail命令从指定点开始将文件写到标准输出.tail-ffilename可以方便的查阅正在改变的日志文件,会把filename里最新的内容显示在屏幕上1.命令格式:tail[必要参数][选择参数][文件]  2.命令功能:用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。3.命令参数:-f 循环读取-q 不显示文件名-v 显示文件…

    2022年6月4日
    70
  • 常用电脑密码破解实用技巧

    常用电脑密码破解实用技巧

    2021年7月24日
    57
  • idea 安装教程_复合门安装视频完整版

    idea 安装教程_复合门安装视频完整版IDEA的安装教程

    2022年10月2日
    3
  • ElasticSearch索引基本查询语法[通俗易懂]

    ElasticSearch索引基本查询语法[通俗易懂]#列出所有索引GET/_cat/indices?v#删除索引DELETE索引名#条件查询GET/索引/类型/_search?pretty{“query”:{“bool”:{“must”:[{“match”:{“tweet”:”elasticsea…

    2025年8月9日
    3

发表回复

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

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