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


相关推荐

  • es6 模板字符串_es6 方法模板渲染

    es6 模板字符串_es6 方法模板渲染前言ES6(ES2015)为JavaScript引入了许多新特性,其中与字符串处理相关的一个新特性——模板字面量,提供了多行字符串、字符串模板的功能,相信很多人已经在使用了。字符串模板的基本使用很简单,今天就带大家来了解了解模板字符串。一、基本使用1、传统字符串传统做法需要使用大量的“”(双引号)和+来拼接才能得到我们需要的模版。但是这样是十分不方便的。并且存下一下几点缺陷:1)传统的字符串拼接不能正常换行2)传统的字符串拼接不能友好的插入变量3)传统的字符串拼接不能友好的处理单引号、双引

    2022年8月21日
    7
  • pycharm 激活码 2022【在线注册码/序列号/破解码】

    pycharm 激活码 2022【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    74
  • 话里话外:流程图绘制初级:六大常见错误

    话里话外:流程图绘制初级:六大常见错误

    2021年8月2日
    126
  • 美团面试中被问到的问题汇总

    美团面试中被问到的问题汇总

    2022年1月22日
    76
  • Exception-NoSuchMethodException

    Exception-NoSuchMethodExceptionNoSuchMethodException-无法找到某一特定方法时,抛出该异常所遇到过的NoSuchMethodException情况:在使用反射时使用如下代码: //创建构造器对象,该方法只能获取public构造,否则会抛出NoSuchMethodException异常 Constructorconstructor=cls.getConstructo

    2022年6月22日
    39
  • ASP.Net中menu控件使用「建议收藏」

    ASP.Net中menu控件使用「建议收藏」为了使用方便asp.net中提供了两类控件html控件与用户控件。这里不在详细介绍。menu属于用户控件。menu最重要的是item属性,item包含了menu控件要显示的类表,几级菜单神马的,点击item属性后面出现一个对话框,也可以点menu控件的箭头如下图:点击编辑菜单项也会弹出对话框,根据自己爱好可以进行设定,下面是我自己设定的:当然旁边对应的是每个条目对应的属

    2022年7月27日
    18

发表回复

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

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