一、一级缓存(Session缓存)
     意义:提高hibernate查询效率。
     缺点:可能会因并发,产生数据不一致。
 
   基于session的缓存,利用hibernate执行查询的时候,hibernate会首先从session缓存去找,如果存在,则直接返回,如果不存在,则利用orm执行查询,将得到的对象保存至session缓存。
 
   可以使用session.evict(obj);将obj从session缓存中移除。
注意:一级缓存,自动开启
hibernate一些与一级缓存相关的操作:
数据放入缓存:
1、save():当session对象调用save方法保存一个对象后,该对象会被放入到session的缓存中。
(2)、get( )和load( ):当session对象调用get( )和load( )方法从数据库中取出一个对象后,该对象也会被放入session的缓存中。
下面证明一下缓存的存在:

 package com.it.test;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import com.it.bean.UserInfo;
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建SessionFactory
SessionFactory sessionfactory = null;
//创建session
Session session = null;
//创建事务
Transaction tx = null;
try {
sessionfactory = new Configuration().configure().buildSessionFactory();
session = sessionfactory.getCurrentSession();
//开启事务
tx=session.beginTransaction();
UserInfo u = (UserInfo) session.get(UserInfo.class, "1001");
System.out.println("-------");
//清除缓存,这里如果没有清除缓存,那么控制台就会只输出一次查询,当清除了缓存后就会有输出两次查询语句。这正好说明了缓存的存在。
session.evict(u);
UserInfo u1 = (UserInfo) session.get(UserInfo.class, "1001");
//提交
tx.commit();
} catch (Exception e) {
e.printStackTrace();
//事务回滚
tx.rollback();
}
}
}
数据从缓存中清除:
(1)、evict( ):将指定的持久化对象从缓存中清除,释放对象所占的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象。
(2)、clear( ):将缓存中的所有持久化对象清除,释放其占用的内存资源;
其他缓存操作:
(1)、contains( ):判断指定的对象是否存在于缓存中。
(2)、flush( ):刷新缓存区的内容,使之与数据库保持同步。
 
二、二级缓存(SessionFactory缓存)
   基于SessionFactory 的缓存,利用hibernate执行查询的时候,hibernate会首先从session缓存去找,如果存在,则直接返回,如果不存在则去二级缓存中去找,存在则返回,不存在则利用orm执行查询,将得到的对象保存至session缓存,可以存至二级缓存。
     
     注意:二级缓存需要在SessionFactory配置文件中,进行两处配置。
          a.配置启用二级缓存
          b.配置二级缓存实现类
          需要对缓存本身进行专门的配置。(xxx.xml--配置缓存)
适用场合:频繁查询,海量数据,极少修改的对象。
 
三、延迟加载
hibernate下延迟加载:load执行查询时,返回hibernate代理对象,当操作其非主属性时才会利用orm执行。
eg:(部分代码)

 //延迟加载--用的时候才执行
UserInfo u = (UserInfo) session.load(UserInfo.class, "1001");
System.out.println("---1----");
System.out.println(u.getUser_name());
//输出结果:查询语句在------1-----后才执行,用到的时候再执行,且如果取得是主属性,就不用查询,因为load里已经给了
延迟加载可以在bean对应的xxxxx.hbm.xml文件中设置lazy="false"(关闭了延时加载,就会变成即可加载)
 
load和get的区别:
     load                   get
  默认:延迟加载   默认:即可加载
  查不到:抛出异常     查不到:返回null
 
使用load需注意:操作非主属性时要在事务提交之前使用(会报错:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session);
而使用get时在提交事务后仍能操作非主属性。

 使用load:  //延迟加载--用的时候才执行
UserInfo u = (UserInfo) session.load(UserInfo.class, "1001");
System.out.println("---1----");
tx.commit();
//在事务提交之后操作非主属性会抛异常:org.hibernate.LazyInitializationException
| System.out.println(u.getUser_name()); |
|--------------------------------------------------------------------------------------------------|
使用get: //使用get
UserInfo u = (UserInfo) session.load(UserInfo.class, "1001");
System.out.println("---1----");
tx.commit();
//在事务提交之后还能操作属性,因为已经得到在之前已经得到了该对象
System.out.println(u.getUser_name());

hibernate缓存(一级缓存、二级缓存)的更多相关文章

  1. hibernate的一级和二级缓存

    一级缓存就是Session级别的缓存,close后就没了. 二级缓存就是SessionFactory级别的缓存,全局缓存,要配置其他插件. 什么样的数据适合存放到第二级缓存中? 1.很少被修改的数据 ...

  2. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存

    二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...

  3. Hibernate的查询,二级缓存,连接池

    Hibernate的查询,二级缓存,连接池 1.Hibernate查询数据 Hibernate中的查询方法有5中: 1.1.Get/Load主键查询 使用get或者load方法来查询,两者之间的区别在 ...

  4. hibernate框架学习之二级缓存

    缓存的意义 l应用程序中使用的数据均保存在永久性存储介质之上,当应用程序需要使用数据时,从永久介质上进行获取.缓存是介于应用程序与永久性存储介质之间的一块数据存储区域.利用缓存,应用程序可以将使用的数 ...

  5. Mybatis一级、二级缓存

      Mybatis一级.二级缓存   一级缓存 首先做一个测试,创建一个mapper配置文件和mapper接口,我这里用了最简单的查询来演示. <mapper namespace="c ...

  6. 【mybatis源码学习】mybtias一级,二级缓存

    转载:https://www.cnblogs.com/ysocean/p/7342498.html mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSessi ...

  7. Mybatis 的一级、二级缓存?

    1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 C ...

  8. Mybatis 的一级、二级缓存?

    1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 C ...

  9. mybati缓存机制之二级缓存配置

    二级缓存配置 在MyBatis的配置文件中开启二级缓存. <setting name="cacheEnabled" value="true"/> 在 ...

  10. Hibernate缓存策略(一级缓存和EHcache二级缓存)

    如何配置二级缓存: 第一步:导入EHcache依赖 1)Maven项目: <!--此处使用hibernate4--> <dependency> <groupId>o ...

随机推荐

  1. [ASP.NET MVC 小牛之路]01 - 理解MVC模式

    本人博客已转移至:http://www.exblr.com/liam  PS:MVC出来很久了,工作上一直没机会用.出于兴趣,工作之余我将展开对MVC的深入学习,通过博文来记录所学所得,并希望能得到各 ...

  2. ABP(现代ASP.NET样板开发框架)主题线下交流会(上海)开始报名了!

    点这里进入ABP系列文章总目录 ABP主题线下交流会(上海)开始报名了 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称.它是采用最佳实践和流行技术 ...

  3. php后台增加删除修改跳转页面

    第一步 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...

  4. 30个你必须记住的CSS选择符

    所以你学会了基础的id,类和后代选择符,然后你就一直用它们了吗?如果是这样,你丢失了(css的)巨大的灵活性.在本文中提到的很多选择器属于CSS3规范的一部分,因此,只有在现代浏览器中才可使用. 1. ...

  5. Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx

    Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx 1. 摘要算法的大概流程2 2. 旧约圣经 (39卷)2 2.1. 与古兰经的对 ...

  6. 【Win 10应用开发】实现全屏播放的方法

    有人会问,以前的MediaElement控件不是有现成的一排操作按钮吗?而且可以直接进入全屏播放.是的,我们知道,以往的Store App都是在全屏模式下运行的,只要MediaElement控件填满整 ...

  7. OPEN CASCADE Curve Continuity

    OPEN CASCADE Curve Continuity eryar@163.com Abstract. 设计一条复杂曲线时,出于设计和制造上的考虑,常常通过多段曲线组合而成,这就需要解决曲线段之间 ...

  8. Objective-C中把数组中字典中的数据转换成URL

    可能上面的标题有些拗口,学过PHP的小伙伴们都知道,PHP中的数组的下标是允许我们自定义的,PHP中的数组确切的说就是键值对.而在OC我们要用字典(Dictionary)来存储,当然了Java用的是M ...

  9. ANNOTATION PROCESSING 101 by Hannes Dorfmann — 10 Jan 2015

    原文地址:http://hannesdorfmann.com/annotation-processing/annotationprocessing101 In this blog entry I wo ...

  10. 解决 android 高低版本 webView 里内容 自适应屏幕的终极方法

    转载请声明出处(http://www.cnblogs.com/linguanh/) 一,先说下我的情况,大家可以对号入座(嫌无聊请跳过) 我的项目要求是这样的,先从数据库里面拿出来html标签,因为加 ...