
三月,你不能跳吗? >>> 
本文介绍了hibernate的查询缓存和二级缓存,如何配置它们以及它们如何工作.
摘要
休眠二级缓存是用于存储实体数据的应用程序级缓存,而查询缓存是用于仅存储查询结果的单独缓存. 这两个缓存通常一起工作. 毕竟,我们很少看到仅使用一种缓存的情况. Hibernate Cahce通过减少对的SQL访问次数来提高程序性能.
二级缓存的工作方式
辅助缓存存储实体数据,而不存储实体本身. 数据以类似于HashMap的键值格式存储. 键是实体的ID,值是原始值的集合. 内容如下:
*-----------------------------------------*
| Person Data Cache |
|-----------------------------------------|
| 1 -> [ "John" , "Q" , "Public" , null ] |
| 2 -> [ "Joey" , "D" , "Public" , 1 ] |
| 3 -> [ "Sara" , "N" , "Public" , 1 ] |
*-----------------------------------------*
通过id从获取对象时,或者遍历了延迟加载映射关系时,获取的对象将被填充到辅助缓存中.
查询缓存的工作方式
查询缓存也是类似于HashMap的结构. 键由查询语句和参数组成. 该值是与查询语句匹配的实体ID的集合:
*----------------------------------------------------------*
| Query Cache |
|----------------------------------------------------------|
| ["from Person where firstName=?", ["Joey"] ] -> [1, 2] ] |
*----------------------------------------------------------*
某些查询不返回实体,而是返回原始值. 在这种情况下hibernate二级缓存注解,原始值存储在查询缓存中. 执行可缓存的JPQL / HQL查询时,查询结果可以存储在查询缓存中.

查询缓存和二级缓存之间的关系
如果在执行查询之前存在缓存的结果集,则SQL语句将不再访问,而是直接从查询缓存中获取查询结果,然后在结果中使用实体标识符(ID)设置为访问二级缓存. 如果二级缓存包含具有指定ID的数据,则返回与该数据相对应的实体. 否则,将查询以获得该实体.
如何在程序中使用缓存
首先导入hibernate-ehcache.jar
然后将以下属性添加到SessionFactory配置文件中
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<prop key="net.sf.ehcache.configurationResourceName">ehcache-ext.xml</prop>

使用EhCacheRegionFactory而不是SingletonEhCacheRegionFactory,然后Hibernate将为其创建一个单独的缓存区域,而不是重用程序中其他地方已经存在的缓存区域.
下一步添加缓存配置文件
<?xml version="1.0" ?><ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
updateCheck="false"
xsi:noNamespaceSchemaLocation="ehcache.xsd" name="yourCacheManager">
<diskStore path="java.io.tmpdir"/>
<cache name="yourEntityCache"
maxEntriesLocalHeap="10000"
eternal="false"
overflowToDisk="false"
timeToLiveSeconds="86400" />
<cache name="org.hibernate.cache.internal.StandardQueryCache"
maxElementsInMemory="10000"
eternal="false
timeToLiveSeconds="86400"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU" />
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToLiveSeconds="86400"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU" /></ehcache>
如果未指定,则使用默认缓存hibernate二级缓存注解,但请尝试避免使用默认配置. 最后,确保每个ehcache元素都有一个name属性. 这样可以防止他使用默认名称来避免与其他配置冲突.
使用辅助缓存
为了使缓存正常工作,必须首先将注释添加到实体类:

@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY,
region="yourEntityCache")
public class SomeEntity {
...
}
辅助缓存还可以缓存关联的实体,但是您还必须评论关联的实体:
@Entity
public class SomeEntity {
@OneToMany
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY,
region="yourCollectionRegion")
private Set<OtherEntity> other;
}
使用查询缓存
配置查询缓存后,默认情况下无法缓存查询,并且必须使用缓存显式标记查询. 以下查询被标记为已缓存
@NamedQuery(name="account.queryName",
query="select acct from Account ...",
hints={
@QueryHint(name="org.hibernate.cacheable",
value="true")
}
})
将条件查询标记为缓存:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-159467-1.html
应该是他儿子去和人