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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 查看linux内核版本号的方法_查看系统型号命令

    查看linux内核版本号的方法_查看系统型号命令小编给大家分享一下关于查看Linux系统版本、内核版本、查看Linux的IP地址以及Terminal终端最常用到的几个命令符:一、查看Linux系统版本(cat/etc/issue或者lsb_release-a)二、查看Linux内核版本命令(cat/proc/version或者uname-a)三、查看Linux的IP地址:四、常用命令:1、tab键命令补全2、cle…

    2022年10月10日
    0
  • 海思Hi3798处理器参数,Hi3798芯片详细信息介绍

    海思Hi3798处理器参数,Hi3798芯片详细信息介绍Hi3798CV200集成4核64位高性能CortexA53处理器、内置NEON加速引擎,强大的CPU处理能力可以满足各种差异化的业务需求。在码流兼容性、在线视频播放的流畅性、图像质量以及整机性能方面保持业界最好的用户体验。支持4K2KP60@10bit超高清视频解码和显示,支持H.265/HEVC、H.264/AVC、AVS+、MVC、MPEG2、MPEG4、VC-1、VP6、VP…

    2022年6月30日
    110
  • 引导页 聚焦效果

    引导页 聚焦效果

    2021年12月7日
    34
  • 国产安全加固操作系统(安全可靠应用替代)

    据国家信息安全漏洞共享平台(CNVD)统计数据,2016年我国共收录通用软硬件漏洞10822个,漏洞来源涵盖了众多知名的国外厂商。应用软件的不安全性对我国信息技术发展产生了重大威胁,近年来我国频繁发布信息安全相关政策,鼓励安全可靠技术和产业生态发展,以应对这种局面。安可产业要实现技术自主可控,需要在四个层面逐步实现:基础硬件设施,如芯片、服务器、存储、交换机、路由器;底层…

    2022年4月15日
    132
  • 软件著作权的代码要求_软件著作权 源代码

    软件著作权的代码要求_软件著作权 源代码软件著作权源代码文档格式要求分类:专利申请常见问题发表时间:2020-10-27软件著作权源代码文档格式要求是什么?软件著作是计算机软件,在申请保护时需要提交软件的源代码。源代码是有格式要求的,以文档形势提交,那么这份源代码文档格式要求是什么呢?需要注意哪些问题呢?本文你详细介绍。常见的源代码包含:C语言,VB,C++,JAVA,.NET等。提交的代码必须是源代码的开头载入程序,第30页必…

    2022年9月16日
    0
  • PCI 总线学习笔记

    PCI 总线学习笔记

    2021年12月10日
    38

发表回复

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

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