持久态对象:

自动更新数据库,原理是一级缓存。

缓存:是一种优化的方式,将数据存入内存,从缓存/内存中获取,不用通过存储源

Hibernate框架中提供了优化手段:缓存,抓取策略

Hibernate中提供了两种缓存机制:一级缓存,二级缓存

一级缓存:session级缓存,一级缓存生命周期与session一致(是由session中一系列Java集合构成)

二级缓存:SessionFactory级别的缓存,需要配置的缓存,开发中一般用Redis替代了。

一级缓存:

即session缓存,session缓存是一块内存空间,存放相互管理的Java对象。

在使用Hibernate查询对象的时候,首先使用对象属性的OID值在Hibernate的一级缓存中进行查找,如果找到,直接在一级缓存中取出来使用,不再查询数据库。

如果没有找到相同OID值对象,则回去数据库中查询。当从数据库中查询所需数据时,该数据也会放到一级缓存中。

在Session接口的实现中包含一系列的Java集合,这些Java集合构成了Session缓存。只要Session缓存没有结束生命周期,存放在它缓存中的对象也不会结束生命周期。

特点:

  • 当应用程序调用Session接口的save()、update()、saveOrUpdate时,如果Session缓存中没有相应的对象,Hibernate就会自动的把从数据库中查询到的相应对象信息加入到一级缓存中国去。
  • 当调用load()、get()时,或者Query接口中的list()、iterator时,会判断缓存中是否存在该对象,有则返回,不会查询数据库,如果缓存中没有要查询的对象,再去数据库中查询对应对象,并添加到一级缓存。
  • 当调用close()时,session缓存会被清空。

作用:减少对数据库访问的次数。

证明一级缓存的存在:

一级缓存的快照区:

package com.Hidemo1;

import java.io.Serializable;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import com.HiUtils.HibernateUtils;
public class HibernateDemo3 {
@Test
/**
* 一级缓存的测试
*/
public void demo1(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction(); // 证明以及缓存的存在
/* Customer customer = session.get(Customer.class, 3l);
System.out.println(customer);
Customer customer2 = session.get(Customer.class, 3l);
System.out.println(customer2);
System.out.println(customer == customer2); */ Customer customer3 = new Customer();
customer3.setCust_name("凤姐");
Serializable id = session.save(customer3);
Customer customer4 = session.get(Customer.class, id);
System.out.println(customer4);
transaction.commit();
session.close();
}
@Test
/**
* 一级缓存的快照区
*/
public void demo2(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction(); Customer customer = session.get(Customer.class, 5l);//发送sql语句查询,同时放入到一级缓存中
customer.setCust_name("凤姐"); transaction.commit();
session.close();
}
@Test
/**
* 一级缓存的快照区
*/
public void demo3(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction(); Customer customer = session.get(Customer.class, 5l);//发送sql语句查询,同时放入到一级缓存中
session.clear();//清空所有
// session.evict(customer);//清除单个
Customer customer2 = session.get(Customer.class, 5l);//发送第二次sql语句
transaction.commit();
session.close();
} }

回顾事务:

什么是事务:指的是逻辑上的一组操作,组成这组操作的各个逻辑单元要么全部成功,要么全部失败。

事务的特性:

  • 原子性:事务不可分割
  • 一致性:事务执行的前后完整性保持一致
  • 隔离性 :  事务在执行过程中不应该受到其他事务的干扰。
  • 持久性 :  代表一个事务完成后数据持久到数据库

如果不考虑隔离性,引发安全问题

读问题

  • 脏读  : 一个事务读到另一个事务未提交的事务
  • 不可重复读 : 一个事务读到另一个已经提交的update数据,导致前后查询结果不一致。
  • 虚读 :  一个事务读到另一个事务已经提交的insert数据,导致在前一个事务多次查询结构不一致

写问题(了解) 

  • 引发丢失更新

读问题的解决:

设置事务的隔离级别:

  • Read Uncommitted   : 以上的读问题都会发生
  • Read Committed        :  解决脏读,但是不可重复读和虚读有可能发生   Oracle
  • Repeatable read         : 解决脏读和不可重复读,但是虚读有可能发生    MySQL
  • Serializable                 : 解决所有读问题

Hibernate中设置事务隔离级别:

  • Read Uncommitted   :1
  • Read Committed        :  2
  • Repeatable read         : 4
  • Serializable                 : 8

在核心配置文件中加上:<property name="hibernate.connection.isolation">4</property>

Service层事务:

事务应该加在业务层,dao只是封装单个操作。例如转账,可能要经过多个操作,所以事务应该封装在业务层。

ThreadLocal:绑定线程的对象。在业务上加事务,就必须绑定ThreadLocal

  • 将连接绑定到当前线程中。
  • 在DAO方法中,通过当前的线程获得到连接对象。
  • Hibernate框架内部绑定好了ThreadLocal
  • 在SessionFactory中,提供了一个方法,getCurrentSession,获取当前线程中的Session,默认不能用,需要通过配置。

Hibernate解决Service的事务管理:

改写工具类:

添加配置:

getCurrentSession无需close,线程结束自动关闭Session

四 Hibernate的一级缓存&事务管理及其配置的更多相关文章

  1. hibernate学习(四)hibernate的一级缓存&快照

    缓存:提高效率 硬件的 CPU缓存   硬盘缓存   内存 软件的  io流缓存 hibernate  的一级缓存   也是为了操作数据库的效率. 证明一级缓存在  : Person p=sessio ...

  2. Hibernate中一级缓存和二级缓存使用详解

    一.一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个 session(一定要同一个ses ...

  3. Hibernate 之 一级缓存

    本篇文章主要是总结Hibernate中关于缓存的相关内容. 先来看看什么是缓存,我们这里所说的缓存主要是指应用程序与物流数据源之间(例如硬盘),用于存放临时数据的内存区域,这样做的目的是为了减少应用程 ...

  4. 【Hibernate】一级缓存

    一.概述 二.证明Hibernate的一级缓存的存在 三.一级缓存中快照区 四.管理一级缓存 五.Hibernate一级缓存的刷出时机 六.操作持久化对象的方法 一.概述 什么是缓存: 缓存将数据库/ ...

  5. Hibernate-实体-对象状态-一级缓存-事务-查询

    一 hibernate中的实体规则 1.1 实体类创建的注意事项 持久化类提供无参数构造         --在调用instance()方法时默认调用空参构造 成员变量私有,提供共有get/set方法 ...

  6. Hibernate的一级缓存

    Hibernate的一级缓存 什么是缓存:缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取 缓存的好处:提升程序运行的效率.缓存技术是Hibe ...

  7. hibernate(二)一级缓存和三种状态解析

    序言 前一篇文章知道了什么是hibernate,并且创建了第一个hibernate工程,今天就来先谈谈hibernate的一级缓存和它的三种状态,先要对着两个有一个深刻的了解,才能对后面我要讲解的一对 ...

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

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

  9. Hibernate 的一级缓存和二级缓存总结

    缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存Cache.缓存目的:让数据更接近于应用程序,协调速度不匹配,使访问速度更快 ...

随机推荐

  1. 杭电2629 Identity Card

    题目意思很简单,就是根据身份证号码来确定一个人的籍贯和生日,(然而我开始脑子抽了还以为还要根据奇数偶数判断男女233333). 然后我的暴力ac代码: #include <iostream> ...

  2. Mac夜神模拟器99%无法正常使用

    PS:部分因更新OS X导致的卡99%可以尝试更新VBOX来解决此问题. 下载VBOX地址:https://www.virtualbox.org/wiki/Downloads         选择对应 ...

  3. 大数据篇:YARN

    YARN YARN是什么? YARN是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率.资源统一管理和数据共享等方面带来了巨大 ...

  4. Ubuntu将Python3软连接到Python

    sudo ln -s /usr/bin/python3 /usr/bin/python

  5. Vue入口页

    Template里面的App就是在这个实例里面注册的App组件 也就是整个过程就是将el所标识的元素替换成<App/> 而App就是在此实例注册的App组件.

  6. ARM CORTEX-M3 内核架构理解归纳

    ARM CORTEX-M3 内核架构理解归纳 来源:网络 个人觉得对CM3架构归纳的非常不错,因此转载 基于<ARM-CORTEX M3 权威指南>做学习总结: 在我看来,Cotex-M3 ...

  7. 本地启动tomcat的时候报java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space

    1.问题:我在tomcat中放入了大量的war包,启动的时候报:java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: ...

  8. 运行cmd直接进入指定目录下的命令

    新建一个.bat批处理文件,文件命令为@ECHO OFF cmd /k cd /d c:data 运行该批处理文件cmd就可进入指定的文件夹,感兴趣的朋友可以参考下啊 新建一个.bat批处理文件,文件 ...

  9. 《精通iOS开发》书籍目录

    1.欢迎来到iOS和Swift世界 2.创建一个新项目 3.实现基本交互 4.更丰富的用户界面 5.自动旋转和自动调整大小 6.多视图应用 7.分页栏与选取器 8.表视图简介 9.导航控制器和表视图 ...

  10. cmd进入任何一个文件夹的步骤?

    cmd进入任何一个文件夹的步骤具体如下: 步骤如下: 1.点击左下角[开始],在搜索程序和文件中输入:cmd,进入cmd命令窗口: 2.进入到D盘,在cmd命令窗口输入:D: 3.进入D盘后,输入:c ...