mysql session缓存_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就会抛出此异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值