mysql evict_Hibernate的flush()和evict()

article/2025/8/16 20:10:03

/**

* 测试uuid主键生成策略

*/

public void testSave1() {

Session session = null;

Transaction tx = null;

try {

session = HibernateUtils.getSession();

tx = session.beginTransaction();

User1 user = new User1();

user.setName("李四");

user.setPassword("123");

user.setCreateTime(new Date());

user.setExpireTime(new Date());

//因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理

//不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false

session.save(user);

//调用flush,hibernate会清理缓存,执行sql

//如果数据库的隔离级别设置为为提交读,那么我们可以看到flush过的数据

//并且session中existsInDatebase状态为true

session.flush();

//提交事务

//默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush

//commit后数据是无法回滚的

tx.commit();

}catch(Exception e) {

e.printStackTrace();

tx.rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

/**

* 测试native主键生成策略

*/

public void testSave2() {

Session session = null;

Transaction tx = null;

try {

session = HibernateUtils.getSession();

tx = session.beginTransaction();

User2 user = new User2();

user.setName("张三1");

user.setPassword("123");

user.setCreateTime(new Date());

user.setExpireTime(new Date());

//因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id

//纳入了session的管理,修改了session中existsInDatebase状态为true

//如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据

session.save(user);

tx.commit();

}catch(Exception e) {

e.printStackTrace();

tx.rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

/**

* 测试uuid主键生成策略

*/

public void testSave3() {

Session session = null;

Transaction tx = null;

try {

session = HibernateUtils.getSession();

tx = session.beginTransaction();

User1 user = new User1();

user.setName("王五");

user.setPassword("123");

user.setCreateTime(new Date());

user.setExpireTime(new Date());

//因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理

//不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false

session.save(user);

//将user对象从session中逐出,即session的EntityEntries属性中逐出

session.evict(user);

//无法成功提交,因为hibernate在清理缓存时,在session的insertions集合中取出user对象进行insert操作后

//需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session的entityEntries

//中逐出了,所以找不到相关数据,无法更新,抛出异常

tx.commit();

}catch(Exception e) {

e.printStackTrace();

tx.rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

/**

* 测试uuid主键生成策略

*/

public void testSave4() {

Session session = null;

Transaction tx = null;

try {

session = HibernateUtils.getSession();

tx = session.beginTransaction();

User1 user = new User1();

user.setName("王五");

user.setPassword("123");

user.setCreateTime(new Date());

user.setExpireTime(new Date());

//因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理

//不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false

session.save(user);

//flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象

//清除,并且设置session中existsInDatebase的状态为true

session.flush();

//将user对象从session中逐出,即session的EntityEntries属性中逐出

session.evict(user);

//可以成功提交,因为hibernate在清理缓存时,在session的insertions集合中无法找到user对象

//所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态

tx.commit();

}catch(Exception e) {

e.printStackTrace();

tx.rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

/**

* 测试native主键生成策略

*/

public void testSave5() {

Session session = null;

Transaction tx = null;

try {

session = HibernateUtils.getSession();

tx = session.beginTransaction();

User2 user = new User2();

user.setName("张三11");

user.setPassword("123");

user.setCreateTime(new Date());

user.setExpireTime(new Date());

//因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id

//纳入了session的管理,修改了session中existsInDatebase状态为true

//如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据

session.save(user);

//将user对象从session中逐出,即session的EntityEntries属性中逐出

session.evict(user);

//可以成功提交,因为hibernate在清理缓存时,在session的insertions集合中无法找到user对象

//所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态

tx.commit();

}catch(Exception e) {

e.printStackTrace();

tx.rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

/**

* 测试assigned主键生成策略

*

*/

public void testSave6() {

Session session = null;

Transaction tx = null;

try {

session = HibernateUtils.getSession();

tx = session.beginTransaction();

User3 user = new User3();

user.setId("001");

user.setName("张三");

session.save(user);

user.setName("王五");

session.update(user);

User3 user3 = new User3();

user3.setId("002");

user3.setName("李四");

session.save(user3);

//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

//Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?

//hibernate按照save(insert),update、delete顺序提交相关操作

tx.commit();

}catch(Exception e) {

e.printStackTrace();

tx.rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

/**

* 测试assigned主键生成策略

*

*/

public void testSave7() {

Session session = null;

Transaction tx = null;

try {

session = HibernateUtils.getSession();

tx = session.beginTransaction();

User3 user = new User3();

user.setId("003");

user.setName("张三");

session.save(user);

user.setName("王五");

session.update(user);

session.flush();

User3 user3 = new User3();

user3.setId("004");

user3.setName("李四");

session.save(user3);

//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

//Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?

//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

//因为我们在session.udpate(user)后执行了flush,所以在清理缓存时执行flush前的sql不会生成

//sql会按照我们的意愿执行

tx.commit();

}catch(Exception e) {

e.printStackTrace();

tx.rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

Hibernate的flush机制:http://sind.iteye.com/blog/255429

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2009-03-05 01:49

浏览 7992

评论


http://chatgpt.dhexx.cn/article/qS31jZJf.shtml

相关文章

Ceph Cache Tier中flush和evict机制源码分析

存储系统:ceph-14.2.22 操作系统:ubuntu-server-16.04.07 OSDService::agent_entry [ ceph/src/osd/OSD.cc ] OSD服务启动过程中会创建一个名为osd_srv_agent的线程,在分层存储中,该线程负责缓存池与数据池之间的数据迁移工作。该…

HashMap evict 放逐之旅

HashMap evict 放逐之旅 我不认识的evict小结 我不认识的evict 正在撸猫写代码的我,遇到了一个LinkedHashMap ConcurrentModifyException,真是让人头秃。问题排查过程也是费了一些力气(手动狗头),最后发现是我异步请求…

Redis源码剖析之内存淘汰策略(Evict)

文章目录 何为Evict如何EvictRedis中的Evict策略源码剖析LRU具体实现LFU具体实现LFU计数器增长LFU计数器衰减 evict执行过程evict何时执行evict.c 总结 Redis作为一个成熟的数据存储中间件,它提供了完善的数据管理功能,比如之前我们提到过的 数据过期和…

WiredTiger系列2:Eviction详解

Eviction Evict的实质主要是将内存中的page淘汰出内存,简单来说,当cache里面的“脏页”达到一定比例或cache使用量达到一定比例时,wt就会触发相应的evict page线程来将pages(包含干净的pages和脏pages)按一定的算法&a…

onload事件

onload事件&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script type"text/javascript">//onload事件的方法function onloadFun(){alert(静态注…

onUnload事件

1. 首先JavaScript会使我们有能力创建动态页面然后JavaScript是可以被侦测到事件行为的然而在网页中的每一个元素都将可以来产生某些可以触发JavaScript的函数的事件就可以打个比方说我们在用户中里面点击某个按钮时的产生的某一个onClick 事件来触发某个函数之后就在事件中在H…

script标签的onload事件的触发时机

onload事件在资源被加载完成后会被触发。对于script标签&#xff0c;在外部js文件被加载后代码会被立即执行。那么&#xff0c;外部js文件中的代码和该script标签的onload回调函数&#xff0c;它们的执行顺序是怎样的呢&#xff1f;没有找到官方的说明文档&#xff0c;所以自己…

load事件

javaScript中最常用到的一个事件就是load。当页面完全加载后&#xff08;包括所有图像、javaScript文件、css文件等外部资源&#xff09;&#xff0c;就会触发window上边的load事件。 window&#xff1a; window.addEventListener(load, function(e) {console.log(页面完全加…

onload 和 onunload 事件

onload 和 onunload 事件会在用户进入或离开页面时被触发。onload 事件可用于检测访问者的浏览器类型和浏览器版本&#xff0c;并基于这些信息来加载网页的正确版本。onload 和 onunload 事件可用于处理 cookie。 onmousedown,onmouseup 以及 onclick 构成了鼠标点击事件的所有…

window的onload事件的用法

1.最简单的用法 注&#xff1a;奇葩&#xff0c;我没用过 2.在JS语句调用&#xff08;正确使用姿势&#xff09; 或使用jquery onload 事件会在页面或图像加载完成后立即发生。 3.window.onload()的加载问题 由于HTML加载时由上往下的&#xff0c;在HTML加载的时候&#…

JS中window.onload事件详解

window.onload出现的原因&#xff1f;  我们都知道页面的代码顺序是从上往下进行加载&#xff0c;很多时候我们要对页面中的某一个模块进行操作&#xff0c;这时候我们常常使用javascript代码来进行操作。为了能够保证操作的模块或对象在js代码之前就加载了&#xff0c;我们不…

浏览器的onload事件

如下代码&#xff0c;因为代码从上到下执行&#xff0c;btn节点还未创建好就去获取会报错 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge&q…

JavaScript的window.onload事件的理解

window.onload()的作用 window.onload() 方法用于在网页加载完毕后立刻执行的操作&#xff0c;即当 HTML 文档加载完毕后&#xff0c;立刻执行某个方法。window.onload() 通常用于 元素&#xff0c;在页面完全载入后(包括图片、css文件等等)执行脚本代码。 只有一个要执行的函…

I2C协议——I2C框图和I2C通信过程

1.软件模拟和硬件模拟的概念 所谓软件模拟&#xff0c;即直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平。如控制产生 I2C 的起始信号时&#xff0c;先控制作为 SCL 线的 GPIO 引脚输出高电平&#xff0c;然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至…

通信协议——I2C协议/IIC协议解析

目录 I2C协议概述 I2C通信原理 I2C通信时序 I2C协议概述 同步通信 半双工&#xff08;分时&#xff09; 串行传输 电平信号 特点&#xff1a;①有两根传输线&#xff08;时钟线SCL、双向数据线SDA&#xff09; ②主从模式&#xff1a;通信双方为主设备&#xff08;Master&…

I2C基础

I2C基础 1 基本介绍2 特点3 硬件连接4 通信4.1 控制器4.2 协议 5 SPI VS I2C 1 基本介绍 IC (Inter-Integrated Circuit)。内部集成电路。拥有两根线&#xff0c;一根数据线SDA和一根时钟线SCL。 这两条线都是漏极开路或者集电极开路结构&#xff0c;使用时需要外加上拉电阻&a…

I2C总线协议

1. 简介 I2C (Inter-Integrated Circuit&#xff09;&#xff0c;是一种串行通信总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;实现主控制器和从器件间的主从双向通信&#xff0c;是一种同步半双工通信(两端时钟频率一致&#xff0c;双向通信&#xff0c;但不能同…

I2C协议最细致的讲解

I2C通讯协议(Inter—lntegrated Circuit)是由Phiilps公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c;不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 I2C物理层的特…

沧小海详解面试的必答题——I2C协议

目录 第一部分&#xff1a;I2C协议的概述 第二部分&#xff1a;I2C协议的阐述 第三部分&#xff1a;AT24C04简述 第四部分&#xff1a;基于verilog的程序设计&#xff08;暂无&#xff09; 对于大多从事FPGA行业的应届生来说&#xff0c;在面试过程中很可能会被问到关于I2C…

51单片机模拟I2C协议

什么是I2C 首先需要知道什么是I2C协议。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息&#xff08;摘自百度百科&#xff09;。I2C主要有两条线&#xff0c;一条SDA数据线&#xff0c;一条SCL时钟线。由…