Hibernate的session一级缓存
一级缓存是Session周期的,当session创建的时候就有,当session结束的时候,缓存被清空
当缓存存在的时候,每次查询的数据,都会放在缓存中,如果再次查询相同的数据,则不会再次查询数据库,可以有效的减少数据库的访问量。
但是,session的生命周期很短,当session创建,进行数据库操作后,就会被关闭,同样的,缓存就会被清空。如果是在javaweb中,session的生命周期,就是浏览器向服务器的一次请求。所以,后面hibernate会有相应的二级缓存
操作缓存的几个方法介绍
一:flush()
flush方法会同步缓存与数据库中的数据,就是说,如果从数据库中得到一条数据,也就是一个对象,如果在缓存中,对于这个对象,进行了数据的更改,那么在使用flush()方法的时候,将会把在缓存中修改的数据,同步到数据库中,有可能是删除,也有可能是修改,或者插入。
注:在事务的提交的时候,会自动执行flush()方法,来同步缓存与数据库中的数据。
注意:就算没有执行Transaction 的 commit() 方法,或者手动调用fulsh()方法,也有可能会被调用flush()方法原因如下
1). 执行 HQL 或 QBC 查询, 会先进行 flush() 操作, 以得到数据表的最新的记录
* 2). 若记录的 ID 是由底层数据库使用自增的方式生成的, 则在调用 save() 方法时, 就会立即发送 INSERT 语句.
* 因为 save 方法后, 必须保证对象的 ID 是存在的!
二:refresh()
refresh方法会同步缓存与数据库中的数据,就是把当前数据库中最新的数据给缓存中的对象,下面给出两个例子!
例子1:在高并发的情况,当我已经拿到一行表数据的时候,并且已经封装成了一个对象。这个时候,数据库中的这一行记录被其它的线程改变了数据,那么就是说,我现在的这个对象,已经不是数据库中的最新的数据了,如果使用session.refresh()方法,则会把数据库中最新的数据同步到缓存中!
例子2:这个要给出代码来示例一下,虽然说代码没什么特定的作用,但是还是可以看出一些问题的
//从数据库中拿到数据,并封装成对象
News ne = (News) session.get(News.class, 1);
//这里对这个持久化类进行了修改其成员变量,如果不出意外的话,下面事务提交的时候,就会把这条数据自动提交到数据库中
ne.setAuthor("刘军");
//同样的,我打印这个对象,其实这个时候,输出的已经不是数据库中的数据了,因为我对这个对象作了改变
System.out.println(ne);
//但是如果我对这个对象作refresh()操作的话,就会把数据库中最新的数据同步到缓存对象中
session.refresh(ne);
//打印出来的数据,又是一开始的数据了,也就是刚拿到这个对象的时候的数据
System.out.println(ne);
经过上面的两个例子,就可以发现,refresh()方法,是把数据库中的数据,同步到缓存中!
注:由于数据库的事务机制,在同一个事务中,会保证操作的原子性,所以在此外改的数据,refresh()方法,是刷新不到的,并不是这个方法有问题,而是数据库的隔离机制,Oracle有两种隔离机制,mysql有四种隔离机制,只要把mysql设置成可重复读,就可以查看到最新的数据了!
三:clear()
这个方法,将会把session中当前的全部缓存,都给清空!
四:persist()
它和save()方法一样,都会执行insert操作,但是为什么hibernate会有两个保存数据的方法呢?自然是有区别的,下面给出两个方法的区别!
1:save方法,当执行insert的时候,临时状态的对象,应该是没有id的,如果这个时候,对象被插入了id,那么其实hibernate插入数据的时候,仍然会以主键生成策略为准,所以人为设置的id,是没有作用的,当执行完save方法后,id会重新变成hibernate生成的,或者sql数据库生成的id。
2:persist方法,同样的,它也是一个保存至数据库的一个方法,但是使用persist方法的时候,hibernate会检查这个对象是否已经有主键id了,如果已经有,则不会执行insert方法,相反的会抛出异常!
两个方法的作用比较,使用save方法,可以把一个对象多次保存,使用persist对象,可以保证这个数据,只能插入一次,因为只要执行了一次,这个对象就会有id值,只要有了id值,就不能再执行persist对象,所以可以依据自己的情况来使用这两个方法!
Hibernate的session一级缓存的更多相关文章
- Hibernate事务以及一级缓存02
一. Hibernate中的事务 1. 事务的回顾 1.1 什么是事务(Transaction)(面试重点) 是并发控制的单元,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的 ...
- hibernate中的一级缓存与闪照区
首先Hibernate中的一级缓存默认是打开的,并且范围从session创建到session关闭,存储的数据必须是持久态的数据. 1 //从session创建开始,一级缓存也跟着创建 2 Sessio ...
- hibernate Session一级缓存 应该注意的地方
Session缓存 Hibernate的一级缓存是由Session提供的,因此它存在于Session的整个生命周期中,当程序调用save()/update()/saveOrupdate()/get() ...
- Hibernate中的一级缓存、二级缓存和懒加载(转)
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
- Hibernate中的一级缓存、二级缓存和懒加载
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
- Hibernate入门(四)---------一级缓存
Hibernate一级缓存 Hibernate的一级缓存就是指Session缓存,Session缓存是一块内存空间,用来存放相互管理的java对象,在使用Hibernate查询对象的时候,首先会使用对 ...
- Hibernate 二(一级缓存,多表设计之一对多)
1 对象状态与一级缓存 1.1 状态介绍 l hibernate 规定三种状态:瞬时态.持久态.脱管态 l 状态 瞬时态:transient,session没有缓存对象,数据库也没 ...
- Hibernate 再接触 一级缓存 二级缓存 查询缓存
缓存 就是把本来应该放在硬盘里的东西放在内存里 将来存内存里读 一级缓存: session缓存 二级缓存: sessionFactory级别的 (适合经常访问,数据量有限,改动不大) 很多的se ...
- Hibernate学习之一级缓存
© 版权声明:本文为博主原创文章,转载请注明出处 Hibernate缓存: - 缓存是为了降低应用程序对物理数据源访问的频次,从而提供应用程序的运行性能的一种策略 - Hibernate缓存是提升和优 ...
随机推荐
- cocoapods安装以及使用,安装过程中ruby版本过低
cocoapods安装以及使用,安装过程中ruby版本过低 字数473 阅读103 评论1 喜欢2 1.打开终端 2.移除现有 Ruby 默认源 $ gem sources --remove http ...
- 国庆送干货——前端建站实用UI工具vajoyJS
差不多是从七月开始有空就写一写,写到现在也算是可以拿出来展示了,vajoyJS是一款可以提供多项建站常用UI功能的插件库,让你轻松创建简易幻灯片.模态窗口和单屏滚页等效果.vajoyJS依赖于 jQu ...
- 算法:Astar寻路算法改进
早前写了一篇<RCP:gef智能寻路算法(A star)> 出现了一点问题. 在AStar算法中,默认寻路起点和终点都是N x N的方格,但如果用在路由上,就会出现问题. 如果,需要连线的 ...
- ListView设置headerview和footerview
[简介]headerview就是通常看到的那种listview手势下滑露出上面的部分,下拉到一定位置,松手会开始请求网络数据,然后刷新listview的列表.footerview一般就是listvie ...
- 渐析java的浅拷贝和深拷贝
首先来看看浅拷贝和深拷贝的定义: 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝. 深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所 ...
- Unity3D热更新全书-重头再来
之前写了Unity3D热更新全书系列Blog 提出了下载.加载.脚本三个方面的开源类库 下载方面有EasyDown加载方面有GameObjParser脚本方面有C#Light另外有一个没有独立成库,但 ...
- 如何为编程爱好者设计一款好玩的智能硬件(八)——LCD1602点阵字符型液晶显示模块驱动封装(中)
六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...
- CSS3与页面布局学习总结(四)——页面布局大全BFC、定位、浮动、7种垂直居中方法
目录 一.BFC与IFC 1.1.BFC与IFC概要 1.2.如何产生BFC 1.3.BFC的作用与特点 二.定位 2.2.relative 2.3.absolute 2.4.fixed 2.5.z- ...
- EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离
回到目录 前几天看了一个基于sqlserver的负载均衡与读写分离的软件Moebius,实现的方式还是不错的,这使得用sqlserver数据库的同学时有机会对数据库进行更有效的优化了
- Android开发小问题总结
Android开发遇到的小问题之小解: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...