一、一级缓存(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. Npm install failed with “cannot run in wd”

    Linux环境下,root账户,安装某些npm包的时候报下面的错误,例如安装grunt-contrib-imagemin时: Error: EACCES, mkdir '/usr/local/lib/ ...

  2. Hystrix框架3--线程池

    线程池 在Hystrix中Command默认是运行在一个单独的线程池中的,线程池的名称是根据设定的ThreadPoolKey定义的,如果没有设置那么会使用CommandGroupKey作为线程池. 这 ...

  3. mfc的OnInitDialog的返回值

    以前从未注意过初始化函数的返回值,今天看到书中所述,以后可能用得上. OnInitDialog的返回值告诉windows如何处置输入焦点,如果返回 TRUE,则windows将输入焦点指派给制表键控制 ...

  4. WaitType:ASYNC_NETWORK_IO

    官方文档的定义,是指SQL Server 产生的结果集需要经过Network传递到Client,Network不能很快将结果集传输到Client,导致结果集仍然驻留在SQL Server的Sessio ...

  5. C#设计模式系列:命令模式(Command)

    1.命令模式简介 1.1>.定义 命令模式的目的是解除命令发出者和接收者之间的紧密耦合关系,使二者相对独立,有利于程序的并行开发和代码的维护.命令模式的核心思想是将请求封装为一个对象,将其作为命 ...

  6. 如何转型成为SQL Server DBA

        本篇PPT是我在2015 MVP OPEN Day Comunity Camp上分享的课程.之所以选择这个主题是因为有很多人曾经问过这方面的问题,而与之相关的主题却少之又少,因此我希望将自己的 ...

  7. ASP.NET MVC5 网站开发实践(二) Member区域 - 修改及删除文章

    上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据.   目录: ASP.N ...

  8. WordPress上传含有中文文件出现乱码

    最近打算学习安装配置WordPress,当然同时也在学习PHP+MySQL,希望以后能做一些关于WordPress定制和二次开发,包括主题和插件.在成功安装WordPress3.5中文版之后,就测试了 ...

  9. How to write perfect C code

    Several days ago, I was involved in an argument about choice of C or C++. What I ignored was "l ...

  10. 窥探Swift之使用Web浏览器编译Swift代码以及Swift中的泛型

    有的小伙伴会问:博主,没有Mac怎么学Swift语言呢,我想学Swift,但前提得买个Mac.非也,非也.如果你想了解或者初步学习Swift语言的话,你可以登录这个网站:http://swiftstu ...