- Cache简介:
- )是计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝,应用程序在运行时直接读写缓存中的数据,只在某些特定时刻按照缓存中的数据来同步更新数据存储源。
- 1.1. 持久化层的缓存的范围
- 1) 事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,缓存内的数据通常采用相互关联的对象形式。
- 2) 进程范围:缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据,所以存放的介质可以是内存或硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。松散的对象数据形式有点类似于对象的序列化数据,但是对象分解为松散的算法比对象序列化的算法要求更快。
- 3) 集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性,缓存中的数据通常采用对象的松散数据形式。
- 1.2. 持久化层的缓存的并发访问策略
- 1) 事务型(Transactional)策略:仅仅在受管理环境中适用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读和不可重复读这类的并发问题。
- 2) 读写型(read-write)策略:提供了Read Committed事务隔离级别。仅仅在非集群的环境中适用。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读这类的并发问题。
- 3) 非严格读写型(nonstrict-read-write)策略:不保证缓存与数据库中数据的一致性。如果存在两个事务同时访问缓存中相同数据的可能,必须为该数据配置一个很短的数据过期时间,从而尽量避免脏读。对于极少被修改,并且允许偶尔脏读的数据,可以采用这种并发访问策略。
- 4) 只读型策略(read-only):对于从来不会修改的数据,如参考数据,可以使用这种并发访问策略。
- 2. Hibernate中的缓存:
- 2.1. 一级缓存和二级缓存的比较:
- 第一级缓存
- 第二级缓存
- 存放数据的形式
- 相互关联的持久化对象
- 对象的散装数据
- 缓存的范围
- 事务范围,每个事务都有单独的第一级缓存
- 并发访问策略
- 数据过期策略
- 物理存储介质
- 内存
- 缓存的软件实现
- 启用缓存的方式
- API,直接通过JDBC API来执行指操作。
- 用户管理缓存的方式
- 2.2. 一级缓存的管理:
- obj):从缓存中清除参数指定的持久化对象。
- 2.3. 二级缓存的管理:
- 2.3.1. Hibernate的二级缓存策略的一般过程如下:
- 1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
- 2) 把获得的所有数据对象根据ID放入到第二级缓存中。
- 3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
- 4) 删除、更新、增加数据的时候,同时更新缓存。
- Cache。
- 2.3.2. 什么样的数据适合存放到第二级缓存中?
- 1 很少被修改的数据
- 2 不是很重要的数据,允许出现偶尔并发的数据
- 3 不会被并发访问的数据
- 4 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。
- 2.3.3. 不适合存放到第二级缓存的数据?
- 1 经常被修改的数据
- 2 财务数据,绝对不允许出现并发
- 3 与其他应用共享的数据。
- 2.3.4. 常用的缓存插件
- 的二级缓存是一个插件,下面是几种常用的缓存插件:
- EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
- OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。
- SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。
- JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。
- 2.3.5. 配置二级缓存的主要步骤:
- 1) 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这是最值得认真考虑的步骤。
- 2) 选择合适的缓存插件,然后编辑该插件的配置文件。
- 2.4. 使用EhCache配置二级缓存:
- 2.4.1. 配置准备:
- 1) 把hibernate-ehcache-*.jar加入到当前应用的classpath中。
1. 2) 在applicationContext.xml文件中加入EhCache缓存插件的提供类。
2. "sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
3. ……
4. "hibernateProperties">
5.
6. ……
7.
8. "hibernate.cache.use_query_cache">true
9.
10. "hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider
11.
12. "hibernate.cache.provider_configuration_file_resource_path">/ehcache/ehcache-hibernate-local.xml
13.
14.
15. ……
16.
17. 3) 挎贝ehcache.xml文件到类路径(项目工程的src/ehcache目录下)。
18. 2.4.2. 配置步骤:
19. Hibernate允许在类和集合的粒度上设置第二级缓存。在映射文件中,class>和元素都有一个子元素,这个子元素用来配置二级缓存。
20. 1) 采用注解的方式修改要配置缓存的那个持久化类如code.java
21. @Entity
22. @Table(name = "sys_code")
23. @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
24. public class Code extends IdEntity
25. 2) 编辑ehcache.xml文件:
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net