一、一级缓存(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. Ubuntu 14 安装 .Net Core

    .Net Core的安装包的分发地址如下: https://apt-mo.trafficmanager.net/repos/dotnet-release/pool/main/d/ 方法一: 可以分别手 ...

  2. jsp的 javascript中 嵌套 html 注释

    看到公司的代码,我也是蛋疼了,各种乱. 还发现有很多的jsp的 javascript中 嵌套 html 注释, 这个可行? 我之前可是没用过. 后面查找各种资料发现,这个也是可行的,主要是为了兼容不支 ...

  3. spring官网下载

    1.第一步:打开官网:http://projects.spring.io/ 2.第二步:点击“SPRING FRAMEWORK”图片 3.第三步:点击“小猫”图标 4.第四步:拉到页面中部的位置,找到 ...

  4. 【Prince2是什么】PRINCE2认证之PRINCE2的思维结构

    前两讲我们介绍了PRINCE2衡量绩效的六大要素和四大管理步骤,今天我们继续进行PRINCE2思维结构的介绍. PRINCE2自身有一个非常强大且坚固的思维结构,这个结构有四大元素组成.分别是1原则, ...

  5. 《JS修炼之道》—— 读后总结

    本篇是基于<JS修炼之道>的记录性与总结性的文章,这本书从多种框架的角度,讲述了JS开发中的一些实用技巧. 比如Prototype,JQuery,Mootools,YUI,Dojo,Ext ...

  6. angularjs 2.0 快速案例(1)

    前言 上一节我们已经把环境给搭建起来了,现在我们通过一个快速案例把angular 2.0 初步了解一下,后续我们会深入每一个细节,这个案例主要是一个[英雄(Hero)]列表的展示,创建,编辑.这个案例 ...

  7. iOS-APP发布应注意

    地区范围文件不用填 电话号码前缀是86

  8. SQL Server 日期函数:EOMonth、DateFormat、Format、DatePart、DateName

    一,月份的最后一天 函数 EOMonth 返回指定日期的最后一天 EOMONTH ( start_date [, month_to_add ] ) 1,对于start_date 有两种输入方式,能够转 ...

  9. 创建分区表和查看分区表的Metadata

    未分区的表,只能存储在一个FileGroup中:对table进行分区后,每一个分区都存储在一个FileGroup中.表分区是将逻辑上一个完整的表,按照特定的字段拆分成Partition set,分散到 ...

  10. 用扩展开发一个PHP类

    原文:http://my.oschina.net/mickelfeng/blog/122519?p=1 假设我们要用PHP扩展实 现一个类Person,它有一个private的成员变量$_name和两 ...