session缓存(1)

Hibernate的Session缓存(一级缓存):

  作用:可以减少应用程序访问数据库的次数

  生命周期:只要session没有结束生命周期,并且没有清理缓存,那么存放在缓存中的对象也会一直存在

hibernate把对象分为四种状态:持久化状态,临时状态,游离状态,删除状态,session的特定方法能使对象从一个状态转换到另一个状态

  临时对象(Transient):  1.在使用代理主键的情况下,OID通常为null  2.不处于session缓存中  3.在数据库中没有对应记录

  持久化对象(Persisit):  1.OID不为null  2.位于session缓存中  3.若在数据库中有和其对应的记录,持久化对象和数据库中的相关记录对应

                4.session在flush缓存时,会根据持久化对象的属性变化来同步更新数据库  

              5.再同一个session实例的缓存中,数据表中的每条记录只对应唯一的持久化对象

  删除对象(Removed):    1.在数据库中没有和OID对应的记录  2.不再处于session缓存中  3.一般情况下,应用程序不应该再使用该对象

  游离对象(Detached):    1.OID不为null  2.不再处于session缓存中  3.一般情况下,游离对象是由持久化对象转变过来的,因此数据库中还可能存在它的记录

数据库总共有4种事务隔离级别

        READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)、SERIALIABLE(可串行化)

            Oracle支持2种:READ COMMITTED和SERIALIABLE,默认第一种

            mysql支持4种:默认REPEATABLE READ

 Session常用的几个方法:

    flush():清理缓存,强制使数据表中的记录和session缓存中保持一致,为了保持一致可能会发送sql语句;

        1.在commit()方法中,先调用session的flush()方法再提交事务

        2.flush()方法可能会发送sql语句,但不会提交事务

        3.注意:在未提交事务,或显示的调用session.flush()之前也有可能调用flush()

          1)执行HQL或者QBC查询,会先进行flush()操作,保证得到的是数据表中最新的记录

          2)若记录的ID是由底层数据库使用自增实现的,那么调用save()方法的时候会立即发送Insert语句,因为save()方法后必须保证对象的Id是存在的

    refresh():会强制发送SQL语句,使得session缓存中的对象状态和数据表中的一致;

    clear():清除缓存中的内容;

    save():保存对象

        1.使临时对象变为持久化对象

        2.为对象分配ID

        3.在flush()缓存时,会发送一条insert语句

        4.在save()对象之前设置ID是无效的

        5.持久化对象的ID是不能被修改的

    Persist():也会执行一个insert()操作,与save()的区别:在Persist()操作之前,对象已经有Id的话,则不会执行insert()操作,抛出异常

    get()load() :都是从数据表中获取对象,但还是有区别

        1.执行get()语句会立即加载该对象:立即检索

         执行load(),若不使用该对象,则不会立即执行查询操作,而是返回一个代理对象

        2.若数据表中没有对应记录,并且session没有关闭,同时需要使用对象时,get()返回null,load()抛出异常

        3.load()可能会抛出LazyInitException异常,在需要初始化代理对象之前就关闭session就会抛出此异常

        

    

    

————我愿乘风破浪,踏遍黄沙海洋
原文地址:https://www.cnblogs.com/wb1993/p/5650464.html