Hibernate-缓存

来源:互联网 发布:爱知 编辑:程序博客网 时间:2024/06/11 14:28

1.缓存的目的:为了减少应用程序向数据源发送请求的次数

2.应用程序中存在缓存的工作原理:应用程序 向数据源发送请求,会先到缓存中查找是否有我们需要的数据,如果有则不会去访问数据源,我们称之为缓存命中,直接从缓存中来获取数据,如果缓存中没有,则去访问数据源,并从数据源返回数据的同时,将此次得到的数据放入缓存中

3.Hibernate中的一级缓存:

1.Hibernate中的一级缓存就是session缓存,也称为会话级缓存

2.通过session来从数据库获取数据时,session会把实体存储在内存中,第二次查询同一实体时不会去访问数据库,而是直接从session缓存中获取

3.session缓存中每一个实体都有唯一的OID,也就是说session缓存中存在一个实体,我们第二次查询这个实体的时候不会再向session缓存中插入数据,以为实体有唯一的OID,session缓存中不能存放有两个相同实体的OID

4.session缓存中数据的适用范围是在当前会话,使用不同的session来获取同一条数据时,会多次访问数据库

5.session缓存的生命周期和session一样,session销毁,session缓存的生命周期销毁,所以我们没有必要考虑session缓存的销毁问题

6.session缓存是无法取消的,也就是说Hibernate强制开启session缓存,不可取消

7.对session缓存进行管理的两个方法:

1.evict():用于将某个对象从一级缓存中清除

2.clean():用于清除一级缓存中所有的对象

8.一级缓存也会对我们程序的性能造成影响,因为在做CRUD的时候会更新session缓存,提高复杂度,但一级缓存总体是能够提升应用程序的效率的

9.关于一级缓存的两个方法:

Query query = session.creatQuery();

1.List list = query.list():通过此方法来返回一个List的集合,不会使用session缓存,访问同一实体会多次访问数据源

2.Iteator it = query.iteator():该方法执行时会先在缓存中查找所有数据的id,然后根据ID来分别访问数据库,查询几条数据,就会执行几条sql语句,如果缓存中没有ID,他会访问数据库来获取数据

4.疑问:有一些常用的数据,在一个session缓存后,我们希望能在其他session中直接使用,而不用再次缓存,这时候我们该怎么办呢?为此二级缓存诞生

5.Hibernate的二级缓存:

1.二级缓存:每个session共用的缓存

2.二级缓存并不是默认开启的,而是需要我们手动配置的

3.配置二级缓存需要的步骤:

1.添加二级缓存所对应的jar包

2.在hibernate的配置文件中配置Provider(提供商,也就是配置二级缓存的提供商的描述)

3.添加二级缓存所需要的属性配置文件

4.在需要缓存的数据库表对应的映射文件里面配置</catch>标签:表明这个表开启二级缓存(<cache usage="read-only"></cache>)

4.标签详解:

1.<cache usage="" include="" region=“”></cache>:配置事务特性:usage="read-only"----只读,include="all":缓存和本实体相关的延迟加载的属性,include="non-lazy":不缓存和本实体相关的延迟加载的属性,region=”“给当前实体一个别名,用于在二级缓存的配置文件中指定缓存策略

5.二级缓存属性配置文件的cache标签内的属性详解:

1.maxElementsInMemory:设置缓存中创建对象的最大数

2.eternal:设置缓存中的对象是否是永久的

3.timeToldIeSeconds:设置缓存中数据的钝化时间,也就是对象过期时间前的空闲时间

4.timeToliveSeconds:设置对象在过期时间前的生存时间

5.overFolwToDisk:设置缓存溢出后是否存储在硬盘上

6.二级缓存叫做全局缓存,或者应用级缓存

7.二级缓存中数据的适用范围是应用的所有会话,不会因为某一个会话的销毁而销毁,而是同sessionFacotry的销毁而销毁

8.二级缓存是插拔式缓存,默认使用的是EHcache,还有其他支持二级缓存的组件,例如:OScache,HashTable,TreeCache,Jboss等

9.什么数据适合放在二级缓存中:

1.不经常被修改的数据,因为经常被修改的数据,修改的同时还要修改数据库和更新缓存,效率很慢

2.不是很重要的数据,允许出现偶尔并发的数据

3.不会被高并发访问的数据

4.参考数据

10.一二级的对比:

1.缓存的范围:

1.一级缓存是事务范围,每一个事务都拥有单独的一个一级缓存

2.二级缓存是应用范围,当期应用内的所有事务共享

2.并发访问策略:

1.一级缓存不会出现并发访问情况

2.二级缓存必须提供适当的并发缓存策略,我们默认的并发访问策略是read-only

3.数据过期策略:

1.一级缓存不用设置数据过期策略

2.二级缓存要设置缓存中的最大对象创建数,过期时间,钝化时间

4.缓存软件的实现:

1.一级缓存是框架自带的

2.二级缓存是由第三方提供,可以插拔集成

5.物理介质:

1.一级缓存存在于内存中

2。二级缓存可以存在于内存中,也可以溢出时存储在硬盘上

6.启用方式:

1.默认启用,不可关闭

2.默认不会启用,选择性开启

11.总结:

1.hibernate中缓存可以提高检索效率

2.hibernate中分为一级缓存和二级缓存,也可以说会话级缓存和应用级缓存

原创粉丝点击