为什么需要缓存?

缓存的作用主要用来提高性能,可以简单的理解成一个Map;

使 用缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、 删除缓存中的无效数据。

从上图看出: 当我们去查询对象的时候,首先到一级缓存去取数据,如果有,则不到数据库中取,

如果没有则到数据库中取,同时在一级缓存中放入对象。

一级缓存,Session级共享

save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,

一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清除缓存中的内容。

① 什么操作会向一级缓存放入数据?

save,update,saveOrUpdate,load,get,list,iterate,lock

首先save放入一级缓存,commit提交后才会将数据存入数据库中。

② 什么操作会从一级缓存取出数据?

get / load

get / load 会首先从一级缓存中取,如没有.再有不同的操作

[get 会立即向数据库发请求,而load 会返回一个代理对象,直到用户真的去使用数据,才会向数据库发请求]

list 会不会从session缓存取数据。

③一级缓存不需要配置,就可以使用,它本身没有保护机制,所以我们程序员要考虑这个问题,我们可以同 evict 或者 clear来清除session缓存中对象. evict 是清除一个对象,clear是清除所有的sesion缓存对象

session.evict(obj);

Session.clear();

④session级缓存中对象的生命周期, 当session关闭后,就自动销毁.

我们自己HashMap来模拟一个Session缓存,加深对缓存的深入

package com.hsp.view;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyCache {
//使用map来模拟缓存
static Map<Integer,Student> maps=new HashMap<Integer,Student>(); public static void main(String[] args) {
// TODO Auto-generated method stub getStudent(1);
getStudent(1);
getStudent(1);
getStudent(1);
getStudent(3);
getStudent(3);
} public static Student getStudent(Integer id){ //s.get()
//先到缓存去
if(maps.containsKey(id)){
//在缓存有
System.out.println("从缓存取出");
return maps.get(id);
}else{
System.out.println("从数据库中取");
//到数据库取
Student stu=MyDB.getStudentFromDB(id);
//放入缓存
maps.put(id, stu);
return stu;
}
}
} //我的数据库
class MyDB{ static List<Student> lists=new ArrayList<Student>(); //初始化数据库,假设有三个学生
static{
Student s1=new Student();
s1.setId(1);
s1.setName("aaa");
Student s2=new Student();
s2.setId(2);
s2.setName("bbb");
Student s3=new Student();
s3.setId(3);
s3.setName("ccc");
lists.add(s1);
lists.add(s2);
lists.add(s3); } public static Student getStudentFromDB(Integer id){
for(Student s: lists){
if(s.getId().equals(id)){
return s;
}
}
return null;// 在数据库中没有
}
} class Student{
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

 二级缓存,SessionFacotry级共享

为什么需要二级缓存?

因为一级缓存有限(生命周期短),所以我们需要二级缓存(SessionFactory缓存)来弥补这个问题

  1. 需要配置
  2. 二级缓存是交给第三方去处理,常见的Hashtable , OSCache , EHCache
  3. 二级缓存的原理

访问小明的信息后就会将对象同时存放到一级和二级缓存中。

4.二级缓存的对象可能放在内存,也可能放在磁盘.

如何配置使用二级缓存?

1.将oscache-2.1.jar放入lib文件夹中,同时将log4j-1.2.14.jar引入lib文件夹。

2.在hibernate.cfg.xml文件中进行配置

<property name="cache.use_second_level_cache">true</property>

<!-- 指定使用哪种二级缓存 -->

<property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>

<!--启用查看命中率 -->
<property name="hibernate.generate_statistics">true</property>

<!-- 指定管理的对象映射文件 -->

<mapping resource="com/xidian/domain/Message.hbm.xml" />

<mapping resource="com/xidian/domain/Users.hbm.xml" />

<!--指定哪个domain启用二级缓存  -->

<class-cache class="com.xidian.domain.Users" usage="read-write"/> <!-- 指定哪个domain启用二级缓存-->

特别说明二级缓存策略:

■  只读缓存(read-only)

      ■ 读写缓存(read-write) [ 银行,财务软件]

      ■ 不严格读写缓存(nonstrict-read-write) [bbs 被浏览多少次]

      ■ 事务缓存(transactional)

3. 可以将oscache.properties文件放在 src目录下,这样你可以指定放入二级缓存的对象capacity 大小. 默认1000。

//完成一个统计,统计的信息在Sessfactory

//SessionFactory对象.

Statistics statistics= HibernateUtil.getSessionFactory().getStatistics();

System.out.println(statistics);

System.out.println("放入"+statistics.getSecondLevelCachePutCount());

System.out.println("命中"+statistics.getSecondLevelCacheHitCount());

System.out.println("错过"+statistics.getSecondLevelCacheMissCount());

未解决问题:

Users stu1=(Users) s.get(Users.class, 1);

s.evict(stu1);

Users stu2=(Users) s.get(Users.class,1);

Hibernate发了两次sql语句

这种情况下放入1 命中0 错过2

第一次查询时会错过一次,向数据库中发sql语句,然后放入一次。然后将对象stu1在session中删除,

这个时候应该是一级缓存中没有二级缓存中有。第二次再次查询的时候,又错过了一次,

然后又向数据库中发sql语句进行查询。不知道为什么?

第二次查询的时候应该在一级缓存中没有找到的情况下找到二级缓存并击中一次。

hibernate总结:

Hibernate(十)__缓存机制的更多相关文章

  1. hibernate中的缓存机制

    一.为什么要用Hibernate缓存? Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数据源中的数 ...

  2. Hibernate学习之缓存机制

    转自:http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N ...

  3. 分享知识-快乐自己:论Hibernate中的缓存机制

    Hibernate缓存 缓存: 是计算机领域的概念,它介于应用程序和永久性数据存储源之间. 缓存: 一般人的理解是在内存中的一块空间,可以将二级缓存配置到硬盘.用白话来说,就是一个存储数据的容器.我们 ...

  4. Hibernate(十四)缓存

    一.什么是缓存 缓存是介于应用程序和永久必数据存储源之间,目的是为了降低应用程序直接读写永久必数据存储源的频率,从而提高运行性能 缓存通常是在内存中的如: Office中的Word.excel Hib ...

  5. 【Hibernate 7】浅谈Hibernate的缓存机制

    一.Hibernate缓存机制简介 对于Hibernate本身来说,它的缓存主要包括三部分:session缓存(一级缓存).二级缓存.查询缓存. 1.1,session缓存 随着session的关闭而 ...

  6. Hibernate 缓存机制全面讲解

    简介 为了降低应用程序访问我们的数据的时候的频率,提高数据读取的速率.比如计算机中为了缓解CPU和内存之间速度差异而引入的缓存是一样的道理.Hibernate同样对缓存进行了支持,使得程序的运行效率得 ...

  7. hibernate(九) 二级缓存和事务级别详讲

    序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...

  8. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  9. hibernate缓存机制(转)

    原文出处:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是 ...

随机推荐

  1. TDR测试原理

    什么是TDR? TDR是英文Time Domain Reflectometry 的缩写,中文名叫时域反射计,是测量传输线特性阻抗的主要工具.TDR主要由三部分构成:快沿信号发生器,采样示波器和探头系统 ...

  2. 查看html元素绑定的事件与方法的利器

    WEB标准提倡结构.表现和行为相 分离,现在越来越多采用这种表现和行为的方式,但它也为我们开发调试带来一些问题,网页载入一堆JavaScript,,我们很难搞清楚最后在哪些元素的哪个动作绑定了事件,尤 ...

  3. CentOS On VirtualBox

    背景 后台开发需要随时与服务器交互,本人使用Mac开发.但是不愿意在Mac上直接安装redis以及mysql等等工具.所以选择在VirtualenvBox下安装一个服务器系统,并且使用ssh与其连接. ...

  4. JSP的基本语法

    JSP的基本语法 一.JSP页面中的JAVA代码 二.JSP页面中的指令 三.JSP页面中的隐含对象(九大内置对象) 目录 一.JSP页面中的JAVA代码 JSP表达式(方便输出) JSP小脚本(完成 ...

  5. ASP.NET Core - ASP.NET Core MVC 的功能划分

    概述 大型 Web 应用比小型 Web 应用需要更好的组织.在大型应用中,ASP.NET MVC(和 Core MVC)所用的默认组织结构开始成为你的负累.你可以使用两种简单的技术来更新组织方法并及时 ...

  6. Constraint5:unique 约束和null

    unique约束使用unique index来限制列值的唯一性: 创建unique约束之后,column中允许插入null值,unique 约束将两个null值看作是相同的(即null=null为tr ...

  7. 【Win10 应用开发】语音命令与App Service集成

    昨天,老周演示了语音命令集成这一高大上功能,今天咱们来点更高级的语音命令. 在昨天的例子中,响应语音命令是需要启动应用程序的,那么如果可以不启动应用程序,就直接在小娜面板上进行交互,是不是会更高大小呢 ...

  8. CSS list-style属性控制ul标签样式

    试一试 <style type="text/css" media="all"> ul { list-style-type: disc; } ul#c ...

  9. 一起学微软Power BI系列-官方文档-入门指南(2)获取源数据

    我们在文章: 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍中,我们介绍了官方入门文档的第一章.今天继续给大家介绍官方文档中,如何获取数据源的相关内容.虽然是英文,但 ...

  10. VS2015安装EF Power Tools

    前言 最近在研究EF觉得EF Power Tools比较强大,可以利用其特性来进行Code First模型验证等等,本以为在VS2015扩展和更新中能找到EF Power Tools,结果未找到,还得 ...