Hibernate的一级缓冲

什么是缓冲

缓冲概念:

数据存在数据库中,数据库本身就是一个文件系统,使用流的方式操作文件,但是文件中有很多的内容,用流的操作得效率就低。

解决办法:

  • 把数据存在内存中,不需要使用流的方式,可以直接读取内存中的数据;
  • 把数据放到内存中,提升读取效率;

Hibernate缓冲

1、Hibernate帮我们提供了很多优化的方式,hibernate的缓冲就是优化的一种方式;

2、Hibernate缓冲特点:

a) 第一类:Hibernate一级缓冲;

  1. Hibernate的一级缓冲默认就是打开的。
  2. Hibernate的一级缓冲有使用的范围,是session的范围(从创建session到关闭session)。
  3. Hibernate的一级缓冲中,存储的数据必须是持久状态。

b) 第二类:Hibernate二级缓冲;

  1. 目前已经不使用了,使用了替代技术redis
  2. 二级缓冲默认不是打开的,需要配置才能用
  3. 二级缓冲的使用范围不是session,而是整个sessionfactory的范围。

验证一级缓冲的存在

a) 验证方式

  1. 首先根据id=1查询,返回对象(第一次查询需要查询数据库)。
  2. 其次再根据id=1查询,返回对象(第二次不需要查询数据库)。

//根据id=4查询

//执行了第一次查询后是否查询数据库(是否有查询语句的输出)

User user1 = session.get(User.class, 4);

System.out.println(user1);

//再一次根据id=4查询

//执行第二次查询是否有第二次的查询语句输出

User user2 = session.get(User.class, 4);

System.out.println(user2);

Hibernate:

select

user0_.ID as ID1_0_0_,

user0_.USERNAME as USERNAME2_0_0_,

user0_.PASSWORD as PASSWORD3_0_0_,

user0_.ADDRESS as ADDRESS4_0_0_

from

USER user0_

where

user0_.ID=?

User [id=4, username=hello, password=111111, address=shanxi]

User [id=4, username=hello, password=111111, address=shanxi]

第一次执行get方法后,发送了sql语句查询数据库;

第二次执行get方法后,没有发送sql语句,查询了以及缓冲;

一级缓冲的执行过程

1、首先是去一级缓冲中找数据,而第一次发现没有要的数据,这个时候才会去数据库查询数据(这个时候是持久态对象)。其次把user1的持久态对象放到一级缓冲中。

2、执行了第二次查询,首先查询的是一级缓冲内容,发现以后需要的数据,直接返回。

说明:第一次查询结束的时候,放到缓冲中的数据是零散的,如id=1,username=xxx,再一次查询的时候找到对应的id后重新组装成了新的对象。

Hibernate一级缓冲特性

说明:持久态会自动更新数据库。

//1根据id查询

User user = session.get(User.class, 4);

user.setUsername("qqqqq");//这里不需要调用更新

transaction.commit();

Hibernate:

select

user0_.ID as ID1_0_0_,

user0_.USERNAME as USERNAME2_0_0_,

user0_.PASSWORD as PASSWORD3_0_0_,

user0_.ADDRESS as ADDRESS4_0_0_

from

USER user0_

where

user0_.ID=?

Hibernate:

update

USER

set

USERNAME=?,

PASSWORD=?,

ADDRESS=?

where

ID=?

下面进行讲解执行过程(了解)

Hibernate一级缓冲执行特性

接着上图继续解释(重点):

1、最后提交事务;

2、提交事务的时候,做的事情是:

  比较

     比较一级缓冲的内容和对应的快照区内容是否相同,如果不相同,把一级缓冲内容更新到数据库里面,如果相同就不做更新。

Hibernate一级缓冲的更多相关文章

  1. 关于hibernate一级缓冲和二级缓冲

    关于一级缓冲和二级缓冲的内容,在面试的时候被问起来了,回答的不是很满意,所以有专门找了些有关这方面的文章加以理解 出自:http://blog.csdn.net/zdp072/article/deta ...

  2. hibernate一级缓存

    理解 Hibernate 一级缓存 Hibernate 一级缓存默认是打开,不需要任何的配置.实际上,你无法强制禁止它的使用. 如果你理解了一级缓存实际上和会话是关联的,就很容易理解一级缓存.总所周知 ...

  3. Hibernate一级缓存(基于查询分析)

    首先我们应该弄清什么是hibernate缓存:hibernate缓存是指为了降低应用程序对物理数据源的访问频次,从而提高应用程序的运行性能的一种策略.我们要将这个跟计算机内存或者cpu的缓存区分开. ...

  4. hibernate一级缓存及对象的状态

    hibernate中实体类对象的状态 在hibernate中实体类对象有三种状态 (1)瞬时态(临时态) 瞬时态:即我们自己创建一个对象,还没有保存到数据库就叫临时态,其实也可以说是对像没有id值,跟 ...

  5. Hibernate一级缓存(补)

    ------------------siwuxie095                                 什么是缓存         缓存是介于应用程序和永久性数据存储源(如:硬盘上的 ...

  6. Hibernate一级缓存测试分析

    Hibernate 一级缓存测试分析 Hibernate的一级缓存就是指Session缓存,此Session非http的session会话技术,可以理解为JDBC的Connection,连接会话,Se ...

  7. 说说自己对hibernate一级、二级、查询、缓存的理解。

    说说自己对hibernate一级.二级.查询.缓存的理解. 2016-03-14 21:36 421人阅读 评论(0) 收藏 举报  分类: web开发(19)  版权声明:本文为博主原创文章,未经博 ...

  8. 转载 hibernate一级缓存和二级缓存的区别

    文章来源:http://blog.csdn.net/defonds/article/details/2308972     hibernate一级缓存和二级缓存的区别 缓存是介于应用程序和物理数据源之 ...

  9. Hibernate一级缓存和三种状态

    Hibernate一级缓存又称session缓存,生命周期很短,跟session生命周期相同. 三种状态:1.transient(瞬时态):刚new出来的对象,既不在数据库中,也不在session管理 ...

随机推荐

  1. FPGA开发时钟资源评估需要考虑的问题

    在第一个独立开发的FPGA项目中,使用了Altera平台的三速以太网IP,工作在100M模式下,外部输入的PHY时钟频率为25MHz. 由于在前期没有注意这个外部输入的时钟,导致最后不得不在板子上飞线 ...

  2. 2019牛客多校第一场E ABBA(DP)题解

    链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...

  3. [工具] BurpSuite--XssValidator插件

    0x00 安装 所需软件: 1.burpsuite 2.xssvalidator 源码:https://github.com/nVisium/xssValidator(按照编译指导编译) burpsu ...

  4. Codeforces 980 并查集/模拟贪心最小字典序 找规律/数去除完全平方因子 逆思维倍增预处理祖先标记点

    A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...

  5. squid之------安装与基本配置

    1.rpm安装squid yum -y install squid 2.squid主要组成部分 服务名:squid 主程序:/usr/sbin/squid 配置目录:/etc/squid 主配置文件: ...

  6. cve-2019-1609,Harbor任意管理员注册漏洞复现

    一.Harbor介绍 以Docker为代表的容器技术的出现,改变了传统的交付方式.通过把业务及其依赖的环境打包进Docker镜像,解决了开发环境和生产环境的差异问题,提升了业务交付的效率.如何高效地管 ...

  7. java面向对象3-继承(继承、抽象类、抽象接口)

    4.继承 面向对象概念-类与对象的关系 封装:指隐藏对象的属性和实现细节,仅对外提供公共访问方式,private-构造方法/构造器-this关键字-static关键字(javadoc制作工具类) -代 ...

  8. bootstrap导航菜单做active判断

    先创建2个文件,index 和about,导入bootstrap的css <div class="container"> <ul class="nav ...

  9. nodejs中 require 方法的加载规则

    require参数类型 http.fs.path等,原生模块 ./mod或../mod,相对路径的文件模块 /pathtomodule/mod,绝对路径的文件模块 mod,非原生模块的文件模块 在进 ...

  10. 11. ClustrixDB 管理文件空间和数据库容量

    ClustrixDB监视集群中可用的空间量,并主动警告潜在的容量问题.确定集群容量的阈值是可配置的,如下所述. 存储类型 要了解如何管理设备和数据库的利用率,必须首先了解ClustrixDB如何分配磁 ...