说说自己对hibernate一级、二级、查询、缓存的理解。

说说自己对hibernate一级、二级、查询、缓存的理解。

 分类:

今天面试碰到答不上来。。马上回家查了下,现在写下对hibernate缓存的理解以加深印象。

1、一级缓存

可以简单的理解为session缓存,即同一个session中使用get、load、迭代,会优先重缓存中取,如果没有则查询数据库并存入缓存,session关闭后缓存清空

2、二级缓存

可以直接理解为升级版,即sessionFactory 缓存,即只要使用的session是同一个sessionFactory创建的则可共用缓存,并且修改、删除、添加、会更新缓存。

3、查询缓存

也就是三级缓存(说三级缓存的很坑),我的理解就是query缓存,使用query.setCacheable(true) 即可开启查询缓存,查询缓存只缓存普通属性结果集,不缓存整个实体类结果集,以及实体类ID结果集,查询缓存是针对普通属性结果集的缓存对实体对象的结果集只缓存id,查询缓存在查询实体类时会首先到查询缓存中查询ID然后根据ID到一级或者二级缓存中查询实体类,没有则从数据库取,查询普通属性时也是优先从缓存中取。

  关闭二级缓存,开启查询缓存,调用query.list()会发出N条语句,因为查询缓存是根据ID到二级缓存中找的,没有则查找数据库,二级缓存和查询缓存同时开启则查询同样SQL语句时不会发出数据库请求,而是直接从缓存中取。

备注:

查询缓存只会query.list()起作用.

session.find方法永远是从数据库中获取数据

缓存通过map 使用ID作为KEY来缓存对象、一级和二级缓存只缓存对象

 
1
原文地址:https://www.cnblogs.com/w-wfy/p/6512143.html