zoukankan      html  css  js  c++  java
  • 理解Session缓存机制 操纵持久化对象

            Hibernate向我们提供的主要的操纵数据库的接口,Session就是其中的一个,它提供了基本的增,删,改,查方法.而且具有一个缓存机制,能够按照某个时间点,按照缓存中的持久化对象属性的变化来更新数据库,这就是Session的缓存清理过程.在Hibernate中对象分为三个状态,临时,持久化,游离.如果我们希望JAVA里的一个对象一直存在,就必须有一个变量一直引用着这个对象.当这个变量没了.对象也就被JVM回收了.当然这个是最基本的常识了.当Session的save()方法持久化了一个对象的时候,即使这个对象的引用变量小时了.这个对象也依然存在,因为Sessoin里保存了一个这个对象的引用,当然Session缓存被清空,这个对象就OVER了.在这个对象保存在Sessoin的时候如果调用load()方法试图去数据库中加载一个对象,这个时候Session会先判断缓存中有没有这个对象,如果有了,那么就不需要去数据库加载了.这样可以减少访问数据库的频率,还可以保证缓存中的对象于数据库的同步.
          Session有两个方法,一个commit()事务提交方法,还有flush()刷新缓存方法,都有着清理缓存的作用,flush()进行缓存的清理,执行一系列的SQL语句,但不会提交事务.而commit()方法会先调用flush()方法,然后在提交事务.Session还有一个方法就是setFushMode()方法,用户设定清理缓存的时间点,主要有三种模式,默认Flush.Mode.AUTO
          1)FlushMode.AUTO     Session的查询方法,commit方法,flush方法都会清理缓存.
          2)FlushMode.COMMIT   Session的commit方法,flush方法会清理缓存.
          3)FlushMode.NEVER     Session的flush方法会清理缓存.
    对象的临时状态:刚用new创建对象的时候,它还没有被持久化,这个时候是临时状态.
    对象的持久化状态:已经被加入到Session的缓存中,通常所说的持久化对象就是只一个对象在这个状态的时候.
    对象的游离状态:已经被持久化,但是不属于Session的缓存的时候是游离状态.

         持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

    前奏知识点:

          1、java对象在jvm中的生命周期?对象被创建分配内存空间,只要这个对象被引用变量引用,这个对象就不会被回收器回收。Java集合有一个重要特性,集合存放的是java对象的引用,当向集合中添加对象其实是向集合中添加对象的引用,因此集合没有清空集合中的对象就一直存活。

          2、如果希望java中的对象A一直处于生命周期,就必须保证至少有一个引用变量引用它,或可以通过其他处于生命周期的对象B导航到这个对象A,比如说在对象B的java集合属性中存放了对象A的引用。Session接口的实现中包含了一系列的集合,这些集合构成了session的缓存,如果session实例没有结束生命周期,存放在它缓存中的对象就不会结束生命周期。

          3、清理缓存:session能够在某些时间点上,按照缓存中对象的变化来执行相关的sql语句,来同步更新数据库,这一过程被称为清理缓存

    理解session的缓存:

          1、session缓存就是通过集合类实现的,持久化一个对象的时候,对象会被放到缓存中,即使程序中没有引用变量引用它,只要session缓存没有关闭,持久化对象仍然处于生命周期。

          2、作用:减少访问数据库的频率(先在session缓存中寻找,若没有再发出sql语句到数据库中加载对象);保证数据库中相关的记录和缓存中的相应记录的同步,映射文件建立的是表和类之间的静态映射,而Session则建立表中的关系数据与运行时session缓存的对象的动态映射

          3、脏对象session会为存放其中的对象属性复制一份快照,当清理缓存时,会进行脏检查,即比较当前对象的属性与它的快照来判断对象属性是否发生了变化,如果发生了变化,就称这个对象是脏对象。

          4、Session会在以下时间点清理缓存:当应用程序调用org.hibernate.Transaction.commit( );当程序执行查询操作时,如果缓存中的持久化对象属性发生变化了(查询对象时,将把对象放到缓存中去),就会清理缓存;应用程序调用session.flush()。

  • 相关阅读:
    Nginx 配置实例-动静分离
    nginx-轮询、权重、ip_hash 、fair模式
    nginx-负载均衡
    nginx 常用的命令和配置文件
    Nginx 的简介
    阿里云--安装nginx AND访问超时
    阿里云-docker安装redis AND(docker基本操作命令)
    阿里云-docker安装mysql
    阅读金字塔原理笔记1
    Springboot-整合redis
  • 原文地址:https://www.cnblogs.com/wukong0214/p/2873779.html
Copyright © 2011-2022 走看看