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中搭建DNS服务器

    Linux中搭建DNS服务器目录DNS域传送漏洞域名空间结构DNS解析过程各种解析记录DNS服务器的安装与部署主从DNS服务器的搭建:转发DNS服务器的配置DNSDNS(DomainNameService)域名解析服务,就是将域名和ip之间做相应的转换,利用TCP和UDP的53号端口DNS系统作用:正向解析:根据域名查找对应的ip地址 反向解析:根据ip地址查…

    2022年6月4日
  • 国外最流行的Bootstrap后台管理模板

    国外最流行的Bootstrap后台管理模板工欲善其事,必先利其器对于从事软件开发的您也一样,有一套熟悉的bootstrap后台ui框架让您的开发速度大幅度提升这是本人经常使用到的一些bootstrap后台框架推荐给大家第一名inspiniabootstrap演示地址http://cn.inspinia.cn效果图http://cn.inspinia.cnhttp://cn.inspinia.cn第二名…

    2022年4月25日
  • 软件测试(2) UFT安装

    软件测试(2) UFT安装1.QTP/UFT11.5(安装和破解)Quicktestprofessional(QTP/UFT)11.5官方版(含汉化包)下载地址:http://www.ddooo.com/softdown/63985.htm该网页中有 QTP无限试用教程具体百度网盘:http://pan.baidu.com/s/1hrTydRQ2.UFT12参考:http

    2022年5月12日
  • Java静态内部类(static class)[通俗易懂]

    Java静态内部类(static class)[通俗易懂]在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。一、静态内部类的使用目的。在定义内部类的时候,在其前面加上一个权限修饰符static。这个内部类就变为了静态内部类。如在进行代码程序测试的时候,如果在每一个Java源文件中都设置一个主方法(主方法是某个应用程序的入口,必须具有),那么会出现很多额外的代码。而且最主要的是这段主…

    2022年10月11日
  • RTP协议与实战

    RTP协议与实战一.前言二.RTP协议三.使用jrtplib发送RTP数据包

    2022年6月28日
  • Postman安装与入门简单教程[通俗易懂]

    Postman安装与入门简单教程[通俗易懂]在测试技术中,接口测试是最基础、最重要,也是收益最高的测试技术,作为接口测试工具中的No.1,一起来看看Postman是怎么入门的吧。目录1.安装Postman2.注册Postman账号并登录3.创建Collections4.创建Request5.简单的Demo测试1.安装PostmanPostman下载地址:https://app.getpostman.com/app/download/win64点开后机会自动下载最新版的Postman,如果链接打不开或者很慢也可以上百度去下载,版本旧一点没关系,

    2022年9月18日

发表回复

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

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