zoukankan      html  css  js  c++  java
  • Hibernate一级缓存和三种状态

    Hibernate一级缓存(线程级别缓存,session缓存)

    缓存:使用一级缓存的目的为了减少对数据库的访问次数,从而提升hibernate的执行效率;当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据,如果有数据就不查询数据库,直接从缓存中获取数据);

    Hibernate的一级缓存由Session提供,只存在于Session的生命周期中,当应用程序调用Session接口的save(),update(),saveOrupDate(),get(),load()或者Query和Criteria实例的list(),iterate()等方法时,如果Session缓存中没有相应的对象,hibernate就会把对象加入到一级缓存中,当session关闭时,该Session所管理的一级缓存也会立即被清除;

    session缓存(一级缓存):session对象中存在的缓存。缓存中存放的是(持久化)对象。

    opensession();一级缓存生命周期开始

    session.close();一级缓存生命周期结束

    步骤一 :证明session缓存的存在

    两次执行从数据库中查询id为1的对象,第一次从数据库中取出Student对象,并将此对象存入session缓存中,第二次查询时,直接从session缓存中提出已有的Student对象。

    试图比较两次对象,其返回结果为true,证明一级缓存确实存在。

    一级缓存是以map形式存在的,Map<串行化,Object>。

    session缓存中的快照:一级缓存,对象快照,数据库状态改变,快照随时更新。

    1.update(快照的存在)

    (1).打印sql语句

    Student stu=new Student();//瞬时状态

    stu.setSname("zl");//游离状态

    stu.setSno(2);//游离状态 //与session关联的id不允许修改 ,

    stu.setSgrade(100); //游离状态

    session.update(stu);

     (2)不打印sql语句

    Student stu=(Student)session.get(Student.class,1);

    session.update(stu)

    存在数据库查询时才存在快照,否则不存在快照。

    Hibernate三种状态 

    hibernate 规定三种状态瞬时态、持久态、脱管态
    对象状态
    瞬时态|临时态:transient,session没有缓存对象,数据库也没有对应记录。

    1.与Hibernate没有产生关联

    2.没有与数据库记录产生关联(与数据库中的id没有对应)
    OID特点:没有值

    持久态:persistent,session缓存对象,数据库最终会有记录。(事务没有提交)

    持久化状态:本质是存在缓存中的对象,就是持久化状态。

    1.Hibernate有关联

    2.对象有id
    OID特点:有值

    托管态|游离态:detached,session没有缓存对象,数据库有记录。

    1.没有与Hibernate产生关联

    2.对象有id
    OID特点:有值

      

    Session的细节问题:

    1.保存对象时使用save方法,保存对象时也可以使用persist方法

    persist方法来自于JPA接口,而save方法来自于Hibernate

    2.HQL语句批量查询时,查询结果是否进入缓存?HQL查询是否使用一级缓存?SQL查询结果会放入一级缓存中吗?

    HQL的查询结果会进入缓存中。

    HQL不会使用一级缓存

    SQL查询如果把查询结果封装到对象中,对象会放入一级缓存中。如果没有将查询结果封装到对象中,对象不会放入一级缓存。

     criteria会将查询结果放入一级缓存中,查询不会使用一级缓存。

    Session中的其他API(了解)

    session.clear();清空session;

    session.close();关闭session;

    session.get(Class,Id);获取数据中的对象

    session.refresh();/session.refresh(s1);  强制刷新session中的对象(可解决与数据库中数据不同步的问题)/将缓存对象与数据库中数据同步

    session.flush();对比快照并提交缓存对象

    session.saveOrupdate();//可以同时完成保存或更新操作,

    1.非自然主键情况下,主键为空=>save,主键不空=>update;

    2.自然主键情况下(assigned),主键为空,报错,因为无论是save还是update,都必须指定id;

    主键有值,先根据id,查询数据库,数据库中存在,执行update,不存在,执行insert

     参考:https://blog.csdn.net/fg2006/article/details/6436517

  • 相关阅读:
    数据库Mysql给用户赋予操作表的权限
    C# log4net日志分等级打日志
    C# 将字符串转为函数名
    C# winform无法拖动控件
    C# 程序获取管理员方法
    C# 生成程序目录避免生成多余的XML和pdb
    C# 快速获取一个月的天数或最后一天
    正则
    C# 根据服务名打开所在文件夹
    330 div+css Experience
  • 原文地址:https://www.cnblogs.com/longlyseul/p/9863474.html
Copyright © 2011-2022 走看看