hibernate缓存

回到顶部

1. 为什么要用 Hibernate 缓存?

   Hibernate是一个持久层框架,经常访问物理数据库。

   为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。

   缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。

回到顶部

2. 项目实战

   当 Session 对象调用 save() 方法保存一个对象后,该对象会被放入到 Session 缓存中。

   当 Session 对象调用 get() 或 load() 方法从数据库取出一个对象后,该对象也会被放入到 Session 缓存中。

   当使用同一个 Session 编写 HQL 和 QBC 等从数据库中查询数据时,将直接从缓存中读取数据,不会访问数据库。

   Hibernate 提供了几个方法(evit/clear/contains/flush....)来管理和判断一级缓存。

   现 JavaEE Dao 层中,提供给外部的数据库访问,每次都会从 Session 工厂中获取新的 Session 线程 ,导致一级缓存很少被利用。

   实例项目源码:https://git.oschina.net/LanboEx/hiberdemo

复制代码
        //1.Hibernate 自身的一级缓存,可以查看到只输出了一条 sqlSession session = getSession();UserPO userPO = session.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");System.out.println("1. 第一次访问 DB:" + userPO.getName() + "," + userPO.getPasswd());UserPO userPO1 = session.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");System.out.println("2. 第二次访问 DB:" + userPO1.getName() + ",一级缓存中是否存在特定对象" + session.contains(userPO));
复制代码

复制代码
       //2.使用 evite/clear 方法手动清除缓存中特定对象,可以看到 hiber 输出了两条 SQLSession session1 = getSession();UserPO userPO3 = session1.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");System.out.println("3. 第一次获取对象:" + userPO3.getName() + "," + userPO3.getPasswd());session1.evict(userPO3);UserPO userPO4 = session1.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");System.out.println("4. 第二次获取对象:" + userPO4.getName() + "," + userPO4.getPasswd());
复制代码

回到顶部

3. Hibernate 缓存原理

   Hibernate 缓存包括两大类:

a.Hibernate 一级缓存,又称为[Session的缓存]。

   Session 内置不能被卸载,Session 的缓存是事务范围的缓存(Session 对象的生命周期通常对应一个数据库事务或者一个应用事务)。

   一级缓存中,持久化类的每个实例都具有唯一的 OID。

b.Hibernate 二级缓存,又称为[SessionFactory的缓存]。

   由于 SessionFactory 对象的生命周期和应用程序的整个过程对应。

   Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。

   第二级缓存是可选的,是一个可配置的插件,默认下 SessionFactory 不会启用这个插件。

   Hibernate 提供了 org.hibernate.cache.CacheProvider 接口,它充当缓存插件与 Hibernate 之间的适配器。

   什么样的数据适合存放到第二级缓存中?

   1) 很少被修改的数据

   2) 不是很重要的数据,允许出现偶尔并发的数据

   3) 不会被并发访问的数据

   4) 常量数据

不适合存放到第二级缓存的数据?

  1) 经常被修改的数据

  2) 绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发 

  3) 与其他应用共享的数据。

c.Session 的延迟加载实现要解决两个问题:正常关闭连接和确保请求中访问的是同一个 Session。

   Hibernate Session 就是 java.sql.Connection 的一层高级封装,一个 Session 对应了一个 Connection。

   Http 请求结束后正确的关闭 Session(过滤器实现了Session的正常关闭);

   延迟加载必须保证是同一个 Session( Session 绑定在 ThreadLocal)。

d.Hibernate 查找对象如何应用缓存?

   当 Hibernate 根据 ID 访问数据对象的时候,首先从 Session 一级缓存中查;

   查不到,如果配置了二级缓存,那么从二级缓存中查;

   如果都查不到,再查询数据库,把结果按照 ID 放入到缓存删除、更新、增加数据的时候,同时更新缓存。

e.一级缓存与二级缓存的对比图

 

一级缓存

二级缓存

存放数据的形式

相互关联的持久化对象

对象的散装数据

缓存的范围

事务范围,每个事务都拥有单独的一级缓存

进程范围或集群范围,缓存被同一个进程或集群范围内所有事务共享

并发访问策略

由于每个事务都拥有单独的一级缓存不会出现并发问题,因此无须提供并发访问策略

由于多个事务会同时访问二级缓存中的相同数据,因此必须提供适当的并发访问策略,来保证特定的事务隔离级别

数据过期策略

处于一级缓存中的对象永远不会过期,除非应用程序显示清空或者清空特定对象

必须提供数据过期策略,如基于内存的缓存中对象的最大数目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间

物理介质

内存

内存和硬盘,对象的散装数据首先存放到基于内存的缓存中,当内存中对象的数目达到数据过期策略的maxElementsInMemory值,就会把其余的对象写入基于硬盘的缓存中

缓存软件实现

在Hibernate的Session的实现中包含

由第三方提供,Hibernate仅提供了缓存适配器,用于把特定的缓存插件集成到Hibernate中

启用缓存的方式

只要通过Session接口来执行保存,更新,删除,加载,查询,Hibernate就会启用一级缓存,对于批量操作,如不希望启用一级缓存,直接通过JDBCAPI来执行

用户可以再单个类或类的单个集合的粒度上配置第二级缓存,如果类的实例被经常读,但很少被修改,就可以考虑使用二级缓存,只有为某个类或集合配置了二级缓存,Hibernate在运行时才会把它的实例加入到二级缓存中

用户管理缓存的方式

一级缓存的物理介质为内存,由于内存的容量有限,必须通过恰当的检索策略和检索方式来限制加载对象的数目,Session的evit()方法可以显示的清空缓存中特定对象,但不推荐

二级缓存的物理介质可以使内存和硬盘,因此第二级缓存可以存放大容量的数据,数据过期策略的maxElementsInMemory属性可以控制内存中的对象数目,管理二级缓存主要包括两个方面:选择需要使用第二级缓存的持久化类,设置合适的并发访问策略;选择缓存适配器,设置合适的数据过期策略。SessionFactory的evit()方法也可以显示的清空缓存中特定对象,但不推荐

转载于:https://www.cnblogs.com/LvLoveYuForever/p/7117137.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 连接greenplum,Oracle通过DBLINK访问GreenPlum

为多个数据库之间的整合和迁移做POC,尝试使用Oracle Gateway和Heterogeneous Service来中转访问,测试过好多次,最终发现只有在32位的Oracle当中才能成功配置。 配置环境如下: Windows 2003 32bit 或 Windows 2008 64bit Oracle10G…

如何使用React和Redux前端创建Rails项目

by Mark Hopson马克霍普森(Mark Hopson) 如何使用React和Redux前端(加上Typescript!)创建Rails项目 (How to create a Rails project with a React and Redux front-end (plus Typescript!)) 在Rails项目中使用React和Redux设置单页Javascript App的完整指南。 (A …

分布与并行计算—用任务管理器画CPU正弦曲线(Java)

class drawSin implements Runnable{Overridepublic void run() {final double SPLIT 0.01;// 角度的分割final int COUNT (int) (2 / SPLIT);// 2PI分割的次数,也就是2/0.01个,正好是一周final double PI Math.PI;final int interval 100;// 时间间…

Rails文件上传file_field报错Encoding::UndefinedConversionError

服务器用的是ubuntu12 64bit,环境是ruby1.9.3rails3mysql,测试是在windows2003上。 上传一个【.gitconfig】文件,没有问题,上传【新浪微博数据挖掘.pdf】报错,上传【back.jpg】报错。 下面是两段信息,是从【…

好久不来这里写东西了.

我正准备离开学校去实现自己的目标,很清楚自己在学校的... ...做共享程序员,就不得不考虑些商业上的东西,自己要吃饭啊!我想我是该好好的处理一下这二者的关系. 转载于:https://www.cnblogs.com/wangxiang/archive/2007/01/01/609714.html

Asp.net mvc中使用配置Unity

第一步:添加unity.mvc 第二步:在添加之后会在app_start中生成UnityConfig.cs,UnityMvcActivator.cs 第三步:使用 第四步:效果展示 转载于:https://www.cnblogs.com/WJ--NET/p/7117839.html

顶级数据恢复_顶级R数据科学图书馆

顶级数据恢复Data science is the discipline of making data useful数据科学是使数据有用的学科 When we talk about the top programming language for Data Science, we often find Python to be the best fit for the topic. Sure, Python is undoubtedly an excellent cho…

xp系统oracle数据库,Oracle10g 数据库的安装基于windowsXP

Oracle的安装一、首先去官网下载自身系统相对应的数据库软件http://www.oracle.com/cn/index.htmlOracle软件本身是免费的,个人用途完全没关系,商业用途并被发现才会被Oracle所要求收费,收费买的不是软件,而是授权。何谓授权&…

了解React Native中的不同JavaScript环境

by Khoa Pham通过Khoa Pham 了解React Native中的不同JavaScript环境 (Get to know different JavaScript environments in React Native) React Native can be very easy to get started with, and then at some point problems occur and we need to dive deep into it.Reac…

分布与并行计算—生命游戏(Java)

生命游戏其实是一个零玩家游戏,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮…

正确认识 Vista 激活期限

当我们在安装 Vista 时,可以不输入序列号进行安装,这和以往的操作系统安装有所不同,我们不必再为安装系统时找不到我们的序列号标签而发愁。如果不输入序列号而继续安装系统,那么系统将提示我们有30天的激活期限!这里的…

Oracle使用hs odbc连接mssql2008

1.创建odbc 2.在 product\11.2.0\dbhome_1\hs\admin\ 下拷贝initdg4odbc,把名字改为initcrmsql(init所建odbc的名称) HS_FDS_CONNECT_INFO crmsql #odbc名称 HS_FDS_TRACE_LEVEL 0 HS_FDS_RECOVERY_ACCOUNTsa #要连接的数据库名称 HS_FDS_RECOVERY_PWD…

oracle修改物化视图字段,获取物化视图字段的修改矢量(一)

当表建立了物化视图日志之后,表的DML修改会被记录到物化视图日志中,而物化视图日志则包含了一个修改矢量,来记录哪个列被修改。在文章列的修改矢量可以通过2的N次方来获得,也就是POWER(2, N)。而N的值,就是列的位置。但…

聚合 数据处理_R中聚合的简介:强大的数据处理工具

聚合 数据处理by Satyam Singh Chauhan萨蒂扬辛格乔汉(Satyam Singh Chauhan) R中聚合的简介:强大的数据处理工具 (An introduction to aggregates in R: a powerful tool for playing with data) Data Visualization is not just about colors and graphs. It’s …

大数据 notebook_Dockerless Notebook:数据科学期待已久的未来

大数据 notebookData science is hard. Data scientists spend hours figuring out how to install that Python package on their laptops. Data scientists read many pages of Google search results to connect to that database. Data scientists write a detailed docume…

【NGN学习笔记】6 代理(Proxy)和背靠背用户代理(B2BUA)

1. 什么是Proxy模式? 按照RFC3261中的定义,Proxy服务器是一个中间的实体,它本身即作为客户端也作为服务端,为其他客户端提供请求的转发服务。一个Proxy服务器首先提供的是路由服务,也就是说保证请求被发到更加”靠近”…

分布与并行计算—并行计算π(Java)

并行计算π public class pithread extends Thread {private static long mini1000000000;private long start,diff;double sum0;double cur1/(double)mini;public pithread(long start,long diff) {this.startstart;this.diffdiff;}Overridepublic void run() {long istart;f…

linux复制文件跳过相同,Linux cp指令,怎么跳过相同的文件

1、使用cp命令的-n参数即可跳过相同的文件 。2、cp命令使用详解:1)、用法:cp [选项]... [-T] 源文件 目标文件或:cp [选项]... 源文件... 目录或:cp [选项]... -t 目录 源文件...将源文件复制至目标文件,或将多个源文件…

eclipse类自动生成注释

1.创建新类时自动生成注释 window->preference->java->code styple->code template 当你选择到这部的时候就会看见右侧有一个框显示出code这个选项,你点开这个选项,点一下他下面的New …

rman恢复

--建表create table sales( product_id number(10), sales_date date, sales_cost number(10,2), status varchar2(20));--插数据insert into sales values (1,sysdate-90,18.23,inactive);commit; --启用rman做全库备份 运行D:\autobackup\rman\backup_orcl.bat 生成…