(学习笔记)Hibernate的一级缓存

1、只读需要加事务么?加事务会不会影响速度了?

     锁和不锁区别, 速度上没有影响,建议加事务。

2、hibernate的缓存

     一级缓存——Session

     二级缓存——Cache Concurrency Strategy、 Query Cache、 Cache Provide

 

一级缓存

1、一级缓存就是Session(Map). 一个session生命长度与事务相对应,他是必要的,不能被关闭,并且他能保证一个事务中id号的(唯一),Map的key就是存放对象的主关键字。

2、无论进行对象的save(),update(), saveOrUpdate(),还是load(), find(), list(), iterate(),filter(),这些对象都会被放进缓存中(key, value),一旦flush方法调用,这些对象的状态将与数据库同步。

3、当你load100000个对象,则可能发生"OutOfMemoryException"异常。我们怎么能够使用Hibernate处理这种大量对象批量处理操作了?我们的观点是ORM不适合处理update、delete批量处理。如果你想进行这类操作,有一种更好的手段:使用数据库的存储过程 或者 直接使用SLQ UPDATE 和 Delete语句。如果你非得要用Hibernate进行大批量操作,一旦操作完成立马执行evict操作,释放缓存。(不要把所有的数据都放入缓存)

4、完成所有对象的evict操作,我们调用Session.clear()方法,一般很少用,但是用的时候,作用很大的。

 

-=-=-=-=-=-=-=-=-=-=-=-=DML语句的问题-=-=-=-=-=-=-=-=-=-=-=-=

对于更新,删除DML语句,尽量别使用hql,容易引起不同步

 

举例:

User user = userService.getUserById(userId);//通过get的方式获取,此时username=“张三”

这时候缓存中有user对象了

接着:

 

String hql = "update User u set u.username=李四",然后是有excuteUpdate方式来更新

 

再接着:

User user = userService.getUserById(userId);?你猜此时的username=?  张三

 

测试发现,最后一句没有发出sql语句,明显是从缓存中获取的,那就是之前的那个对象

 

我们知道,如果使用userService.save(user);,user前后的内容跟数据库会保持同步,

 

但是hql语句执行更新了数据库,并没有让持久类的对象user与数据库中保持同步。

 

问题可能:如果我这边执行hql一更新,你缓存中的对象就要同步的话,会加大hibernate的压力,2w条数据,hiberante缓存就要更新两万个对象,不好。。

 

对于save,就没有这个问题。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值