一级缓存是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对象,所以可以依据自己的情况来使用这两个方法!

转载于:https://www.cnblogs.com/zhuxiaojie/p/4943892.html

Hibernate的session一级缓存相关推荐

  1. hibernate中的一级缓存

    hibernate中的一级缓存 Hibernate提供了两种缓存,这里主要写一级缓存. 第一级缓存是session的缓存,由于Session对象的生命周期通常对应一个数据事务或者一个应用事务,因此它的 ...

  2. Hibernate学习之一级缓存

    © 版权声明:本文为博主原创文章,转载请注明出处 Hibernate缓存: - 缓存是为了降低应用程序对物理数据源访问的频次,从而提供应用程序的运行性能的一种策略 - Hibernate缓存是提升和优 ...

  3. Hibernate,Session清理缓存时间点

    当应用程序调用org.hibernate.Transaction的commit()的时候,commit()方法先清理缓存,然后再向数据库提交事务. 当应用程序显示调用Session.flush()方法 ...

  4. hibernate一级缓存和二级缓存的区别[转]

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

  5. Hibernate之一级缓存和二级缓存

    1:Hibernate的一级缓存: 1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率:(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据 ...

  6. Hibernate一级缓存与二级缓存的区别

    一级缓存: 就是Session级别的缓存.一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中. 如果短时间内这个session(一定要同一个session)又做了同一个操作,那么h ...

  7. java中一级缓存二级缓存_[Java] hibernate 一级缓存和二级缓存

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

  8. Hibernate学习(二)持久化类,主键生成策略、一级缓存、事务

    持久化类: 持久化:将内存中的一个对象持久化到数据库中的过程.hibernate是持久层的ORM框架 持久化类:java中的一个对象和数据库表建立了映射关系,就可以称为持久化类,java类+映射文件. ...

  9. [转] Hibernate一级缓存、二级缓存

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

  10. (12) Hibernate+EhCache配置二级缓存

    转载地址 http://jyao.iteye.com/blog/1315726 (有关EhCache的基础介绍可参见:http://sjsky.iteye.com/blog/1288257 ) 本文主 ...

最新文章

  1. js ajax调用请求
  2. SOLO:一次性预测语义类别和实例掩码
  3. Python实现:详解LRU缓存淘汰算法
  4. 手动创建一棵二叉树,然后利用前序、中序、后序、层序进行遍历(从创建二叉树到各种方式遍历)(含运行结果)
  5. list循环添加数据_List 去除重复数据的 5 种正确姿势!你知道几种?
  6. 关于Android软件更新
  7. 虚拟化与云计算(一)之 Lab1 使用 Hadoop Mapreduce 进行数据处理
  8. html中input后的报错信息,js 监测from表单中的input和select,时时监测,没有输入或选择信息报错,不允许提交数据...
  9. key 和secret_Java Secret:加载和卸载静态字段
  10. Centos7.5 lnmp+mongodb扩展
  11. linux重启网络服务_vm上linux虚拟机NAT模式配置
  12. PyCharm 设置护眼背景色
  13. 【神经网络与深度学习】CIFAR-10数据集介绍
  14. 【Hadoop】HDFS数据复制
  15. ThinkPhp 使用 PHP_XLSXWriter 代替 PHPExcel 百万级数据单次导出
  16. HP笔记本ProBook 445R G6刷BIOS历险记
  17. Web前端-课程设计-网易严选
  18. 【kafka思考】最小成本的扩缩容副本设计方案
  19. Java hashCode详解
  20. 2021年美赛B题目简述(中英文)

热门文章

  1. 台企招聘一名PHP程序員
  2. 你学会测试了吗(1):推荐工具
  3. 推荐汪峰的《北京,北京》,虽然有些念头
  4. Qt5学习笔记之bin文件合成工具三:偏移量数据填充
  5. UDSonCAN资料收集
  6. webpack配置babel-loader
  7. 限制页面被pc端访问
  8. 05-python中的异常
  9. 20190901 On Java8 第十五章 异常
  10. Python+Selenium开发工具安装及下载