博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate中的Session缓存问题
阅读量:6266 次
发布时间:2019-06-22

本文共 1854 字,大约阅读时间需要 6 分钟。

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 
>

转载地址:http://godpa.baihongyu.com/

你可能感兴趣的文章
数组方法的二三事
查看>>
js 任务
查看>>
MQTT
查看>>
C++ 学习笔记之——STL 库 queue
查看>>
阿里云开发者工具上手体验
查看>>
前端模块化详解(完整版)
查看>>
CSS 从入门到放弃系列:CSS的引入方式
查看>>
策略模式原来这么简单!
查看>>
js中 split slice splice 的区分
查看>>
阿里云运维总结
查看>>
js实用方法记录-js动态加载css、js脚本文件
查看>>
微信小程序入门: 导航栏样式、tabBar导航栏
查看>>
Runtime整理(二)——Runtime包含的所有函数
查看>>
nodejs request模块用法
查看>>
使用webpack从0搭建多入口网站脚手架,可复用导航栏/底部通栏/侧边栏,根据页面文件自动更改配置,支持ES6/Less...
查看>>
消息未读之点不完的小红点(Node+Websocket)
查看>>
JavaScript 之 DOM [ Node对象 ]
查看>>
使用vscode写typescript(node.js环境)起手式
查看>>
飞天技术汇大视频专场:全民视频时代下的创新技术之路
查看>>
以太坊分片详解
查看>>