• java对象中的三种状态和脏检查及刷新缓存机制


    瞬时状态

      瞬时状态又称临时状态.如果java对象与数据库中的数据没有任何的关联,即此java对象在数据库中没有相关联的记录,此时java对象的状态为瞬时状态,session对于

    瞬时状态的ava对象是一无所知的,当对象不再被其他对象引用时,它的所有数据也就丢失了,对象将会被java虚拟机按照垃圾回收处理

    持久状态

      当对象与session关联,被session管理时,它就处于持久状态.处于直接状态的对象拥有数据库标识符(数据库中主键的值).那么,对象是什么时候与session发生关联呢?

    1. 通过session查询接口,或者get()方法,或者load()方法从数据库中加载对象的时候,加载的对象是与数据库表中的一条记录关联的,此时对象与加载它的session发生关联,
    2. 对瞬时状态的对象调用session的save(),saveOrUpdate()等方法时,在保存对象数据的同事,java对象的内部状态发生了任何变更,hibernate会选择合适的时间(如事务提交时)将变成同步到数据库中

    游离状态

      游离状态又称托管状态,处于持久状态的对象,脱离与其关联的session的管理后,对象就处于游离状态.处于游离状态的对象,hibernate无法保证对象所包含的数与数据

    库中的记录一致,因为hibernate以及无法感知对该对象的任何操作.session提供了update(),saveOrupdate()等方法,将处于游离状态的对象数以更新的方式同步到数据库中

    ,并将该对象与当前的session关联.这时,对的状态就从游离状态重新转换为持久状态

    三种状态之间的转换

    1. 瞬时转持久

      1. 使用session的save(),saveOrUpdate()等方法保存对象后,该对象的状态由谁是状态转换为持久状态
      2. 使用session的get()或load()方法获取对象,该对象的状态是持久状态
    2. 持久转瞬时

      1. 执行session的delete()方法后,对象由原来的持久状态变为瞬时,因为此时该对象没有与任何数据库关联
    3. 持久转游离

      1. 执行session的evict(),clear()或close()方法,对象由原来的持久状态转为游离
    4. 游离转持久

      1. 执行session的update()或saveOrUpdate()方法,对象由游离转为持久,该对象再次与当前session相关联
    5. 游离转瞬时

         1.执行session的delete方法,对象由游离转为瞬时

    注意:处于瞬时或游离的对象不再被其他对象引用时,会被JVM按照垃圾回收机制处理

    脏检查

      在hibernate中,数据前后发生变化的对象,称为脏对象.

    tx= HibernateUtil.currentSession().beginTransaction();
    //获取员工对象,此时对象处于持久状态
    Emp empUpdate = empDao.update(7900);
    //修改后,信息和之前不同,此时 empUpdate对象成为"脏对象"
    empUpdate.setSal(6666);
    //提交事务
    tx.commit();

      以上代码中empUpdate对象处于持久状态,当对象被加入session缓存中时,session会为对象复制一份快照,如果快照的属性发生改变即成为脏对象.

    在事务提交时,hibernate会对session中持久化的对象进行检查,即比较对象当前属性与它的快照,以判断属性是否发生变化,这种判断成为脏检查.

    发生改变session会使用最新的属性值来执行相关的SQL语句,将变化保存确保数据库和对象数据的数据一致

    刷新缓存机制

       当session缓存中对象的属性发生变化时,session并不会立即执行脏检查和相关的SQL语句,而是在特定的时间,即刷新缓存时才执行.使得session

    能够把多次变化合并为一条或者一批SQL语句,减少访问次数提高程序的数据访问性能.

      在默认情况下,session会在以下时间点刷新缓存

    1. 应用程序显示调用session的flush()方法
      1. session的flush()方法进行刷新缓存的操作,会触发脏检查,从而执行相关的SQL语句
    2. 应用程序调用事务的 commit()方法时
      1. commit()方法会先调用session的刷新缓存的方法flush(),然后向数据库提交事务
  • 相关阅读:
    django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别 哈欠涟涟的日志 网易博客
    提示:ERROR 1044 (42000): Access denied for user
    取消选中的区域
    1.XML复习、HTML DOM 复习 2.simpleXML方式解析XML 3.XPath 4,MVC
    JSP的内置对象(session)
    每月自评之三:2013年3月
    HDU1405:The Last Practice
    一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入至一个5x5的方阵中,填入方法如下:
    一个经典实用的 IPtables Shell 脚本
    static class 静态类
  • 原文地址:https://www.cnblogs.com/hfx123/p/9982390.html
Copyright © 2020-2023  润新知