💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
Hibernate的缓存分为三种:一级缓存、二级缓存、查询缓存。下面我就为大家介绍一下。 ## 一、概念。 一级缓存:第一级存放于session中称为一级缓存。Session 级别的缓存,它同session邦定。它的生命周期和session相同。Session消毁,它也同时消毁;管理一级缓存,一级缓存无法取消,用两个方法管理,clear(),evict()。两个session 不能共享一级缓存,因它会伴随session的生命周期的创建和消毁;Session缓存是实体级别的缓存,就是只有在查询对象级别的时候才使用,如果使用HQL和SQL是查询属性级别的,是不使用一级缓存的! 当程序调用save(),update(),saveorupdate()等方法 及调用查询接口list,filter,iterate时,如session缓存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭的时候该Session所管理的一级缓存也会立即被清除Hibernate的一级缓存是Session所内置的,不能被卸载,也不能进行任何配置。 一级缓存的物理介质为内存,由于内存容量有限,必须通过恰当的检索策略和检索方式来限制加载对象的数目。 二级缓存:第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。第二级缓存的物理介质可以是内存和硬盘,因此第二级缓存可以存放大量的数据,数据过期策略的maxElementsInMemory属性值可以控制内存中的对象数目。管理第二级缓存主要包括两个方面:选择需要使用第二级缓存的持久类,设置合适的并发访问策略:选择缓存适配器,设置合适的数据过期策略。 查询缓存:hibernate的查询缓存是主要是针对普通属性结果集的缓存, 而对于实体对象的结果集只缓存id。在一级缓存,二级缓存和查询缓存都打开的情况下作查询操作时这样的:查询普通属性,会先到查询缓存中取,如果没有,则查询数据库;查询实体,会先到查询缓存中取id,如果有,则根据id到缓存(一级/二级)中取实体,如果缓存中取不到实体,再查询数据库。和一级/二级缓存不同,查询缓存的生命周期 ,是不确定的,当前关联的表发生改变时,查询缓存的生命周期结束。 ## 二、对比。 ![](https://box.kancloud.cn/2016-02-22_56caddfb62167.jpg) ## 三、总结。 缓存对于我们来说很重要可以提高系统的性能,把一些经常用到的数据,大的数据存到缓存中这样查询起来比直接查询数据库更加高效。对于大数据量的今天缓存的应用为我们提高效率提供了可能。 PS:这个是一个关于缓存机制的博客:[http://www.blogjava.net/tbwshc/articles/380013.html](http://www.blogjava.net/tbwshc/articles/380013.html)