前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hibernate中的Session缓存问题「建议收藏」

Hibernate中的Session缓存问题「建议收藏」

作者头像
全栈程序员站长
发布2022-07-10 15:26:55
4530
发布2022-07-10 15:26:55
举报

大家好,又见面了,我是全栈君。

1. Session 缓存:

1 ) . 在 Session 接口的实现中包括一系列的 Java 集合 , 这些 Java 集合构成了 Session 缓存 .

用于存放 Session 关联的对象( Session 关联对象的方式有非常多种。

比如: session.get ( Class , OID ) 、 session.update () 、 session.save () )。

仅仅要 Session 实例没有结束生命周期 , 且没有清理缓存。则存放在它缓存中的对象也不会结束生命周期。

Session 缓存可降低 Hibernate 应用程序訪问数据库的频率。

2 ) . 操作 Session 缓存的方法(了解一下吧)。

① . 若调用 session.get () 从数据库中载入一个对象。则该对象会被纳入到 Session 缓存中。

News news = ( News ) session.get ( News.class , 1 );

// 会向数据库发送 SQL 吗 ? 不会发送 SQL 语句 , 而是从 Session 缓存获取对象的引用(快照)

News news2 = ( News ) session.get ( News.class , 1 );

② . Session 的 clear () 方法能够清空 Session 的缓存

News news = ( News ) session.get ( News.class , 1 );

// 清理 session 缓存

session.clear ();

// 会向数据库发送 SQL 吗 ? 会 ! 由于 Session 缓存被清空了 !

News news2 = ( News ) session.get ( News.class , 1 );

③ . Session 的 flush() 方法:

清理缓存 强制使数据库记录和 Session 缓存中对象状态保持一致,可能会发送 SQL 语句

(若数据库记录和 Session 中对象状态不一致。则发送 SQL 。否则不发送 SQL )

I. 默认情况下,提交事务时,会先清理缓存。然后再提交事务

II. 若主键生成方式使用的是数据库底层的自增长方式。会在运行 Session 的 save () 方法时,就清理缓存,运行 INSERT 语句。 而不是等到提交事务时。 Hibernate 要求和 Session 关联的对象必须有和数据表记录相应的 OID ,这就意味着运行 save () 方法后。 必须有 OID ,而底层自增长的方式生成主键,必须先运行 INSERT 才干获取主键值

// 若使用 MySQL 底层自增的方式生成主键, save () 方法即会引起发送 INSERT 语句

session.save ( news );

System.out.println ( news.getId ());

III. 使用 HQL ( Hibernate Query Language )查询记录时,不经过 Session 缓存!直接查询数据库,且要求查询的结果是最新的。

所以,在进行 HQL 查询之前须要先清理缓存

session.save ( news );

// 会导致清理缓存

News news2 = ( News ) session.createQuery ( “FROM News n WHERE n.id = ?” )

. setInteger ( 0 , news.getId ()). uniqueResult ();

IV. commit () flush() 方法的差别:

flush 运行一系列 sql 语句,但不提交事务;

commit 方法先调用 flush () 方法,然后提交事务 . 意味着提交事务对数据库的操作永久保存下来。

④ . refresh () 方法:

强制使 Session 缓存中的对象的状态和数据库记录保持一致。

所以会强制发送一条 SELECT 语句。

注意,由于 MySQL 的默认的隔离级别为 READ REPTABLE 。所以须要设置事务的隔离级别才干看到实验的效果

< ! — 设置 Hibernate 的事务的隔离级别 , 设置为读已提交 –>

<property name =“connection.isolation” >2 </property >

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115322.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年2月6,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档