当前位置: 首页 > news >正文

hibernate框架学习笔记5:缓存

缓存不止存在与程序中,电脑硬件乃至于生活中都存在缓存

目的:提高效率

比如IO流读写字节,如果没有缓存,读一字节写一字节,效率低下

 

hibernate中的一级缓存:提高操作数据库的效率

 

示例:

抽取的工具类

package utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    private static SessionFactory sf;
    
    static{
        //1 创建,调用空参构造
        Configuration conf = new Configuration().configure();
        //2 根据配置信息,创建 SessionFactory对象
         sf = conf.buildSessionFactory();
    }
    
    //获得session => 获得全新session
    public static Session openSession(){
                //3 获得session
                Session session = sf.openSession();
                
                return session;
        
    }
    //获得session => 获得与线程绑定的session
    public static Session getCurrentSession(){
        //3 获得session
        Session session = sf.getCurrentSession();
        
        return session;
    }    
}
View Code

 

测试类:

示例1:

package cache;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import domain.Customer;
import utils.HibernateUtils;

//测试一级缓存
public class Demo {

    @Test
    //证明一级缓存存在
    public void fun1(){
        //1 获得session
        Session session = HibernateUtils.openSession();
        //2 控制事务
        Transaction tx = session.beginTransaction();
        //3执行操作
        
        Customer c1 = session.get(Customer.class, 1l);
        Customer c2 = session.get(Customer.class, 1l);
        Customer c3 = session.get(Customer.class, 1l);
        Customer c4 = session.get(Customer.class, 1l);
        Customer c5 = session.get(Customer.class, 1l);
        
        System.out.println(c3==c5);//true
        //4提交事务.关闭资源
        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联
        
        
        //结果(保证数据库中存在主键为1的数据):
        //这里调用了五次方法,但是只打印一次SQL语句
    }
}

 

原理:程序第一次调用get方法,hibernate发送SQL语句查询数据库,查询结果以ResulySet对象返回,

hibernate再组装成Customer(实体类对象),存入session缓存对象,对象返回给程序

第二次调用get方法,会先从缓存中查看是否存在id=1的Customer对象,如果有,直接返回缓存中的对象

多次调用原理相同

 

明显地发现:这里的缓存技术很好地提升了效率

 

示例2:

    @Test
    //
    public void fun2(){
        //1 获得session
        Session session = HibernateUtils.openSession();
        //2 控制事务
        Transaction tx = session.beginTransaction();
        //3执行操作
        
        Customer c1 = session.get(Customer.class, 1l);
        
        c1.setCust_name("哈哈");//4提交事务.关闭资源
        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联
        
        
    }

引入了快照的概念

原理:

上边的原理其实有省略,数据库返回结果后,hibernate组装的时候,其实组装了两个对象,

一个放入缓存中,一个放入快照,返回给程序的是缓存对象,程序第一次修改了缓存对象,事务提交,

这时候hibernate比较缓存中的对象和快照,如果有变化,会同步到数据库中,没有变化,什么都不做

 

这里就提高了效率,不会多次去数据库查询,只需要比对缓存中的对象,减少不必要地SQL查询语句

 

示例3:

    @Test
    //持久化状态对象其实就是放入session缓存中的对象
    public void fun3(){
        //1 获得session
        Session session = HibernateUtils.openSession();
        //2 控制事务
        Transaction tx = session.beginTransaction();
        //3执行操作
        
        Customer c1 = new Customer();
        c1.setCust_id(1l);//托管|游离
        
        session.update(c1);//c1被放入session缓存了
        
        
        Customer c2 = session.get(Customer.class, 1l);
        
        //4提交事务.关闭资源
        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联
        
        
    }

 

这段代码运行中,打印SQL的UPDATE语句

原因:缓存中不存在快照,c1放入session缓存中对比快照时候必然不一致,而c2这一句调用get方法后,依照上边的原理,才会运行SQL的UPDATE语句

所以,这段代码中真正使hibernate发送SQL语句的是c2这一行

转载于:https://www.cnblogs.com/xuyiqing/p/8449143.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring 的autowired大坑
  • X86汇编快速入门
  • 块存储,文件存储,对象存储的层次关系
  • HDU.3032.Nim or not Nim?(博弈论 Lasker's Nim)
  • VM CentOS Docker 安装
  • 004
  • spark深入:配置文件与日志
  • 微信支付
  • 计算机程序设计艺术(第三卷)pdf
  • react-native-splash-screen
  • C++蜂鸣器歌曲2
  • python之self本类对象
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • 解决数组塌陷的两种方式
  • python 编程题
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 2017届校招提前批面试回顾
  • Centos6.8 使用rpm安装mysql5.7
  • Git的一些常用操作
  • iOS编译提示和导航提示
  • k8s 面向应用开发者的基础命令
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • REST架构的思考
  • 回顾 Swift 多平台移植进度 #2
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 小程序测试方案初探
  • 新手搭建网站的主要流程
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (2015)JS ES6 必知的十个 特性
  • (6)添加vue-cookie
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (Python第六天)文件处理
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (回溯) LeetCode 131. 分割回文串
  • (九)One-Wire总线-DS18B20
  • (九)信息融合方式简介
  • (面试必看!)锁策略
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)Unity3DUnity3D在android下调试
  • (转)一些感悟
  • (自适应手机端)行业协会机构网站模板
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • /etc/fstab 只读无法修改的解决办法
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @RequestBody与@ResponseBody的使用
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [CSS]中子元素在父元素中居中