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

Hibernate中的Session缓存问题

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

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.net/115322.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • FPGA和CPLD对比与入门

    FPGA和CPLD对比与入门入门介绍:1、EMP240使用很广泛了,8元一片。EMP240顾名思义具有240个宏单元,或者说240个触发器,或者理解成240个bit的存储单元。2、仿真分2步,写逻辑时用QUARTUS自带的仿真;逻辑写完后,最好用modelsim专门仿真。3、如果你需要100个逻辑单元,实际用的可能是120个,因此要留出20%的余量。4、一个小技巧,针对EPM240和570来说,常用的封装T

    2022年6月4日
    46
  • 遍历ArrayList并移除一个元素[通俗易懂]

    遍历ArrayList并移除一个元素[通俗易懂]前言这是一个比较经典的面试题,相信也会有不少人遇到,今天就在此记录一下,写了两种方式供大家参考。方式一在for循环中删除元素,倒序遍历ArrayList能够有效防止漏删,这里大家可能会有疑问了?假设按照从0到size-1下标来删那么如果有相邻的两个元素是一样的,删除了第一个,此时数组长度会-1并且所有元素往前移动一位,那么第二个就移动到第一个元素的位置了,此时控值for循环的下标i已经+1了等于直接就跳过了第二个重复元素,倒叙就不会出现此类情况了。List<String>strs=

    2022年7月22日
    8
  • 六种麒麟都是什么麒麟_中标麒麟进入图形界面

    六种麒麟都是什么麒麟_中标麒麟进入图形界面OracleDatabase11.2.0.4.0已在Linuxx86-64NeoKylinLinuxAdvancedServer6上通过认证

    2022年8月10日
    10
  • 单幅图像超分辨率重建(图像超分)

    代码的解析已经给出,现在补上:单图像超分辨率重建示例代码解析目录一、简介二、前期准备三、运行程序四、参考目录一、简介图像超分辨率重建技术就是利用一组低质量、低分辨率图像(或运动序列)来产生单幅高质量、高分辨率图像。图像超分辨率重建应用领域及其宽广,在军事,医学,公共安全,计算机视觉等方面都存在着重要的应用前景。在计算机视觉领域,图像超分辨率重建技术有可能使图像实现从检出…

    2022年4月17日
    203
  • 寻求全站搜索功能开发思路

    寻求全站搜索功能开发思路

    2021年9月22日
    43
  • ❤️学习linux 两年多沉淀下来的linux 命令大全⭐建议收藏⭐[通俗易懂]

    ❤️学习linux 两年多沉淀下来的linux 命令大全⭐建议收藏⭐[通俗易懂]文章目录linux系统命令总结大全关于作者**作者介绍**0.IP地址相关命令0.1ifconfig命令—显示网络设备信息02.ip命令—显示与操作路由03.dhclient命令—动态获取或释放IP地址04.nmtui—界面修改网卡地址信息05.nmcli命令—设置ip地址1.文件目录命令1.1ls命令–显示目录下的内容1.2cd命令—切换目录命令1.3cp命令—复制文件或目录1.4mkdir—创建目录1.5rmdir

    2022年5月1日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号