本文主要摘自Hibernate缓存,整理些要点出来
Hibernate查询缓存依赖于二级缓存。当启用查询缓存后,第一次执行查询语句时,Hibernate会把查询结果保存在二级缓存中。当再次执行查询语句时,只需从缓存中获取查询结果即可。
查询缓存适用于以下场合:
- 经常使用查询语句
- 很少对查询语句关联的数据库数据进行插入,删除和更新操作
查询缓存的配置
- 配置二级缓存
- 在hibernate中配置
<prop key="hibernate.cache.user_query_cache">true</prop>
- 调用
Query
,Criteria
接口的setCacheable()
方法
@Cache
@Cache
定义了二级缓存策略和缓存范围
@Cache(
CacheConcurrencyStrategy usage(); //1
String region() default ""; //2
String include() default "all"; //3
-
usage
: 当前缓存策略(NONE, READ_ONLY, NONSTRICT_READ_WRITE, TRANSACTIONAL)。
-
read-only
: 只读缓存如果你的应用程序只需读取一个持久化类的实例,而无需对其修改, 那么就可以对其进行只读缓存
-
read-write
: 读写缓存
如果应用程序需要更新数据,那么使用读/写缓存比较合适。 如果应用程序要求“序列化事务”的隔离级别(serializable transaction isolation level),那么就决不能使用这种缓存策略
-
nonstrict-read-write
: 不严格读写缓存
如果应用程序只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,那么比较适合使用非严格读/写缓存策略。
-
transactional
:事务性缓存
Hibernate 的事务缓存策略提供了全事务的缓存支持,例如对 JBoss TreeCache 的支持。这样的缓存只能用于 JTA 环境中,你必须指定为其 hibernate.transaction.manager_lookup_class属性。
-
region
: 可选参数,指定二级缓存的去域名,默认为类或者集合的名字. -
include
: 可选参数(all
,non-lazy
)。all
包含所有属性,non-lazy
仅包含非延迟加载的属性
缓存实体
@javax.persistence.Entity
@Table(name = "PROVICE")
@Cache(usage =CacheConcurrencyStrategy.READ_ONLY)
public class Province() {
...
}
缓存集合
@javax.persistence.Entity
@Table(name = "PROVICE")
@Cache(usage =CacheConcurrencyStrategy.READ_ONLY)
public class Province() {//省份对象
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "cityId")
@Cache(usage = CacheConcrrencyStrategy.READ_ONLY)
private Set<City> cities; //省份对应城市
}
此时在访问province.cities
时,Hibernate 只缓存了city的OID,因此在实际查询过程中还是需要执行
select * from city where cityid = ?
为了避免该问题,可以为City
对象同样配置二级缓存
@javax.persistence.Entity
@Table(name = "CITY")
@Cache(usage =CacheConcurrencyStrategy.READ_ONLY)
public class City() {//城市对象
...
}
网友评论