您的位置:首页 > 其它

hibernate一级缓存和二级缓存

2016-09-27 10:45 363 查看
 
   Hiernate 缓存就是在内存中开辟一块空间,把数据存储在这块空间里面,则下次在读取的时候,直接从缓存中拿,提高了查找和加载的效率。

   一级缓存:也就是session级的缓存,不需要进行任何配置,和session的生命周期一样(有多少个session,就有多少个一级缓存,多个session之间不能共享一级缓存)。Load和get都是使用一级缓存的,当一次session访问的时候,第二次直接从一级缓存中得到数据。iterate是直接使用一级缓存的,当查到所对应的数据的时候,便会把数据缓存到一级缓存中,但这时候,会产生n+1问题(比如查询的时候没限定查询个数,数据库表中有多少条记录,便会查询多少次)。解决n+1问题的方式是依靠list只放不用(直接到数据库中查询记录,生成多少个对象,然后放到一级缓存)。之后再利用iterate发出查询id的语句,再去一级缓存中得到相应的数据。因为save是使用缓存的,紧接着在save之后访问查询该主键所对应的记录,可以在缓存中拿到。另外,针对批量数据的存储,我们可以通过执行每n次就强制的将数据持久化,同时清理其缓存,这样就避免了大量数据操作造成的内存溢出。注意:其缓存的也是实体对象,不会缓存对象的属性。

   二级缓存:其缓存是随着SessionFactory创建而创建,所以其里面的数据存储的是经常使用的,很少改动的数据。但使用不但,很容易造成内存泄漏,系统奔溃。所以必须对这块缓存空间进行管理。注意:其缓存的就是实体对象,查询缓存是针对的是属性。配置方式是:首先我们要把二级缓存的配置文件放到项目的根目录下。然后在cfg配置文件中指定管理二级存储的类,要缓存的哪些对象,并在hbm相应的文件中设置其为只读。这些工作准备完成后,再配置开启缓存。使用二级缓存,可以对使用二级缓存的session进行管理,如可以设置session对二级缓存为只读不写,只写不读。另外,还可以使用factory来管理二级缓存,如可以逐出二级缓存的对象。

   通过一级缓存可以通过save,get,load,iterate,list(要通过查询缓存来使用二级缓存,使用不当,也会产生n+1问题)来使用二级缓存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: