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


相关推荐

  • matlab循环求和_r语言for循环计算求和

    matlab循环求和_r语言for循环计算求和题目描述编写程序求和S=a+aa+aaa+aaaa+…,其中a是1-9中的一个数字。n为一正整数,a和n均从键盘输入。(例如输入n为4,a为2,S=2+22+222+2222)输入两行整数,分别表示a,n输出一个整数样例输入Copy24样例输出Copy2468程序代码a=input(”);n=input(”);temp=0;sum=0;fori=1:ntemp=temp*10+a;sum

    2022年10月6日
    0
  • virtualbox增强功能-VBoxGuestAdditions安装

    virtualbox增强功能-VBoxGuestAdditions安装小白的艰辛历程,记录点点滴滴,聚少成多。1、准备virtualbox增强功能VBoxGuestAdditions.iso默认安装virtualbox时就没有增强功能的iso自行下载VBoxGuestAdditions.iso备用如还是没有可以去官网另外下载http://download.virtualbox.org/virtualbox/5.0.2/VBoxGuestAdditions_5.0.2.iso还可以在VBox工具中添加扩展功能,此处仅使用外部添加。2、在virtualb..

    2022年6月24日
    86
  • 腾讯会议——录制的视频如何正常观看(转为MP4格式)

    腾讯会议——录制的视频如何正常观看(转为MP4格式)操作步骤1.打开腾讯会议2.点击**历史会议**3.点击你录制的会议4.点击**录制详情**5.点击**转码**1.打开腾讯会议2.点击历史会议3.点击你录制的会议4.点击录制详情5.点击转码完成这5步,即可将所保存的视频转为MP4格式,便于观看。…

    2022年6月16日
    195
  • MybatisPlus 分布式Id

    MybatisPlus 分布式Id对于分布式id,有很多方案,现在大多数用的是基于雪花算法snowflake的实现,美团有leaf,百度有uid-generator,我这里记录下苞米豆在MybatisPlus3中的分布式id实现简单介绍下雪花算法雪花算法也叫雪花id,是一个64bit的整型数据,原生的snowflake是这样的:最高位不用,41bit保存时间戳,单位是毫秒,10bit的机器位,12bit的唯一序列号,可以理解是某一毫秒内,某台机器生成了不重复的序列号10bit一般一会分为5bit的datacen

    2022年10月30日
    0
  • Vue 插槽之 作用域插槽「建议收藏」

    现在我有如下需求,子组件<user/>中此时有一条用户的信息(userInfo);我要在父组件通过插槽展示这个用户的姓名(userInfo.name);注意:这里的父组件并没有这个用户的信息,子组件中有,如果直接在父组件{{userInfo.name}}获取这条信息是获取不到的;因为,只有<user/>组件可以访问到userInfo,而我们提供的内容是在父…

    2022年4月13日
    58
  • Android ConstraintLayout布局详解[通俗易懂]

    Android ConstraintLayout布局详解[通俗易懂]前言之前在使用AndroidStudio新建项目的时候,发现MainActivity的默认布局从RelativeLayout变成了ConstraintLayout。当时就对这个ConstraintLayout很好奇,就研究了一下。发觉确实很强大,在此做个总结。ConstraintLayout定义什么是ConstraintLayout呢?ConstraintLayout是Google在2016年的

    2022年5月5日
    85

发表回复

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

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