鉴于JBoss 7和persistence.xml中启用了二级缓存的应用程序:
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.JndiInfinispanRegionFactory" />
<property name="hibernate.cache.infinispan.cachemanager" value="java:jboss/infinispan/container/hibernate" />
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<property name="hibernate.cache.default_cache_concurrency_strategy" value="transactional" />
在一些实体上也给出@Cacheable 和@ org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)对某些关系。
因为表现不好我开启了
<property name="hibernate.generate_statistics" value="true" />
在persistence.xml中。
在JPA统计中,我看到很多缓存未命中,即使是我几秒钟前访问过的实体。所以我假设缓存大小不够大。我怎样才能增加它?
我试过
<property name="hibernate.cache.infinispan.entity.eviction.max_entries" value="200000"/>
<property name="hibernate.cache.infinispan.entity.expiration.lifespan" value="1800000"/>
<property name="hibernate.cache.infinispan.entity.expiration.max_idle" value= "1200000"/>
在persistence.xml中但仍然与未命中相同。
澄清:对不起,我的意思是JBoss EAP 7(2016年起),而不是JBoss AS 7(2011年起)。
答案 0 :(得分:2)
除非您使用自定义区域(通过org.hibernate.annotations.Cache
),否则设置hibernate.cache.infinispan.entity.eviction.max_entries
是正确的方法。您甚至可以通过将其设置为-1来完全禁用驱逐。
您修改实体后可以看到缓存未命中;每次写入后缓存都会失效,并且希望在下次读取时重新填充。另一种选择是某些内容正在调用evictEntityRegions或其他操作,最终会调用evictAll或removeAll。如果是这种情况,您必须调试这些方法或安装Byteman规则以找出罪魁祸首。