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)
上一篇 2022年2月6日 上午7:00
下一篇 2022年2月6日 上午8:00


相关推荐

  • 摩尔线程实现智谱 GLM-5 大模型 Day-0 适配,国产 GPU 生态兼容再进一步 – 果核剥壳

    摩尔线程实现智谱 GLM-5 大模型 Day-0 适配,国产 GPU 生态兼容再进一步 – 果核剥壳

    2026年3月12日
    2
  • Centos7下zabbix安装与部署,设置中文(保姆级图文)【网络工程】

    Centos7下zabbix安装与部署,设置中文(保姆级图文)【网络工程】Centos7下zabbix安装与部署,设置中文(保姆级图文)【网络工程】安装过程的一些坑安装zabbix之前需要的环境关闭SeLinux关闭防火墙Firewalls安装apache安装MySQL安装php安装zabbix安装本体安装zabbix的包配置zabbix创建一个zabbix库创建账户并且授权设置密码导入表配置zabbixserver配置文件配置php部署zabbix打开部署网页部署网页设置控制板网页设置登录网页设置中文对服务器自身进行监控总结

    2025年6月13日
    3
  • Android中ActivityManager学习笔记(1)-MemoryInfo「建议收藏」

    Android中ActivityManager学习笔记(1)-MemoryInfo「建议收藏」ActivityManager       与系统中所有的Activity进行交互的类。官网一句话解释了这个东西,但是有点随意了。ActivityManager的作用很多,我们通过它获得内存信息,进程信息,还可以终止某个进程。当然啦,只能终止用户的进程,系统的进程是杀死不了的。下面我通过实例,一步一步学习它的具体作用,我也是刚学,不能从宏观的角度给大家解释清楚它的具体作用。希望通过程序一

    2025年9月26日
    8
  • java integer最小值_db2integer最大值

    java integer最小值_db2integer最大值来自:https://blog.csdn.net/qq_33611068/article/details/77369050有这样一道题:编程测试,遍历0到int所能表示最大的正数,将消耗的时间打印。下面是我的代码:1inttemp=0;2Datedt1=newDate();3longbegintime=dt1.getTime();4for(inti=0;i<=…

    2025年10月8日
    5
  • gpt5可以本地部署吗

    gpt5可以本地部署吗

    2026年3月15日
    3
  • 显卡矿机装linux教程,8张GTX1080Ti显卡加副电源矿机组装教程

    显卡矿机装linux教程,8张GTX1080Ti显卡加副电源矿机组装教程在经历一波短暂的回调后,最近比特币又持续升温,一度突破19000元大关,目前价格基本在18000-19000之间浮动,挖矿市场可谓是一片火爆!近日大风哥闲来无事,自己也倒腾了一台矿机来玩玩,特来大家分享一下安装教程及心得。说到挖矿,显卡当然是首当其冲了,而现阶段市售各型号的显卡也因虚拟币市场火热而处于货源紧缺的状态,可谓是一卡难求!赶巧笔者手上有几片GTX1080Ti,矿机的显卡就选用它们了!Em…

    2022年9月30日
    5

发表回复

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

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