• 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就会抛出此异常

            

        

        

    ————我愿乘风破浪,踏遍黄沙海洋
  • 相关阅读:
    Linux性能监控
    程序员技术练级攻略
    使用 GDB 调试多进程程序
    nginx下面部署fast-cgi和C++【原】
    ROS Learning-024 (提高篇-002) rviz的安装和使用
    ROS Learning-023 (提高篇-001) 准备工作 --- 安装一些必要的软件包
    STM32 C++编程 005 I2c(Soft)类
    Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫
    设置 PyCharm 软件中 Terminal 窗口 中启动的 python 交互命令的版本
    在PyCharm 软件中设置你的项目 使用的Python版本
  • 原文地址:https://www.cnblogs.com/wb1993/p/5650464.html
Copyright © 2020-2023  润新知