1.session 一级缓存对象
缓存:经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制(内存中数据,缓存),应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
1.1 Hibernate 中对象三种状态
- 临时(瞬时)状态对象(TO)
特点:对象没有 OID 值(对象 id值,标识唯一的对象),不受 session 管理 -
持久化状态对象(PO)
特点:对象有 OID 值(对象 id值,标识唯一的对象),受 session 管理 - 游离(托管)状态对象(DO)
特点:对象有 OID 值(对象 id值,标识唯一的对象),不受 session 管理 - 删除状态(非官方说法)
对象状态的转换:
session 对象方法使用可以影响对象的状态
1.2 一级缓存区
session 对象的 save、update、get、load、query.list、query.uniqueResult ,query.iterate 等方法执行后,可以把数据放入到一级缓存中
session 对象的 get 、load、 query.iterate方法可以取一级缓存对象数据,而query.list 、 query.uniqueResult 不能取
注意:将来 用 list 方法放,iterate 方法来取,解决了 iterate 的N+1 问题
1.3 快照区
快照区保存的数据是 一级缓存中数据的拷贝,当执行session.flush 方法,或者说在有事务的前提下 tx.commit()(因为提交事务前隐式的执行了session.flush方法),hibernate 就会做 脏数据检查机制:
快照区域的数据跟 数据库中的数据一定是一样的(同步的),如果一级缓存中的数据发生改变,跟快照区中的数据进行匹配,如果有发现有改变,就会发发出去update 语句去更新 一级缓存数据。