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


相关推荐

  • java引用变量存放在哪_java成员变量存储在哪个内存区域

    java引用变量存放在哪_java成员变量存储在哪个内存区域我们说常量,静态变量存放在方法区中,方法中的临时变量,存放到Java虚拟栈中。有人问,那全局变量*(对象)存放在哪里.其实全局变量就是参考文章中所说的class的字段,就是指全局变量,它是存放在方法区中的。e)方法区与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。在Class文件中除了类的字段、方法、接…

    2022年8月21日
    44
  • java中json的使用和解析[通俗易懂]

    java中json的使用和解析[通俗易懂]1.创建json对象1.1创建JSONObject对象使用map初始化json可以看到,当value为null时,转化为json后不会保存,会直接抛弃。使用javabean初始化json直

    2022年7月3日
    40
  • python中的eval函数的用法_isnan函数

    python中的eval函数的用法_isnan函数eval函数在Python中具有非常重要的地位,熟练的使用eval函数能够为我们的Python编程提供很多的便利之处。在本文中我将详细记录eval函数在Python中的使用方法及它带来便利时带来的一些其他危害,希望您阅读完本文后能够有所收获。欢迎在文章下方留言共同交流学习。

    2025年8月12日
    2
  • 网站开发html_网页基础代码大全

    网站开发html_网页基础代码大全网页的标准是W3C,目前模式是HTML、CSS和JavaScript。HTML标签<!DOCTYPEHTML>是文档声明,必须写在HTML文档的第一行,位于<html>

    2022年8月2日
    7
  • LVM扩容操作

    LVM扩容操作文章目录一、测试环境二、给lvm分区扩容(加硬盘)1.新增硬盘2.给新的硬盘分区3、Lvm操作查看卷组状态:`vgdisplay`创建物理卷:`pvcreate/dev/sdb1`扩展卷组:`vgextend卷组名物理卷路径`扩展逻辑卷:lvextend拉伸文件系统:xfs_growfs或者resize2fs4、验证结果:参考文档一、测试环境我是在virtualbox上安装的测试环境:centos。其具体硬盘配置如下df-Th磁盘情况:fdisk-l今天主要是分别操作下

    2022年6月20日
    38
  • IGMP协议原理_IGMP协议详解

    IGMP协议原理_IGMP协议详解IGMP协议概述IGMP(InternetGroupManagementProtocol)因特网组管理协议,是TCP/IP协议簇中负责IP组播成员管理的协议。IGMP协议运行于主机与主机直接相连的组播路由器之间,主要用于维护组播成员关系。IGMP发展了三个版本:IGMPv1:定义了基本的组成员查询和报告过程。IGMPv2:添加了组成员快速离开的机制。IGMPv3:成员可以指定接收…

    2022年9月14日
    1

发表回复

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

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