我成功地将Hazelcast用作Hibernate的L2分布式缓存。看起来查询缓存没有分布式。是不是可以为'hibernate查询缓存'使用分布式缓存?或者我是否缺少配置以确保“查询缓存”也是分布式的? 使用Hazelcast 3.2.6和Grails 2.2.3。
答案 0 :(得分:4)
"注意:QueryCache始终是节点的本地,并且永远不会分布在Hazelcast Cluster"它来自hazelcast文档。也许如果你在hibernate regionFactory配置上使用HazelcastLocalCacheRegionFactory,它将数据存储在本地节点中,并在本地更新/删除条目时发送失效消息。
以下是第177页的淡褐色文档http://docs.hazelcast.org/docs/3.4/manual/pdf/hazelcast-documentation-3.4.pdf
答案 1 :(得分:1)
我正在测试解决方案,但显然它有效......
1 - 创建实现RegionCache的DistributeQueryCacheHazelcastFactory。
2 - 在此类中放入HazelcastCacheRegionFactory + AbstractHazelcastCacheRegionFactory的内容(您需要这样做,因为buildQueryResultsRegion被标记为final)。
3 - 实现buildQueryResultsRegion以返回扩展AbstractTransactionDataRegion(需要创建它)并实现QueryResultsRegion的类DistributedQueryCacheDataRegion。
4 - 更改" hibernate.cache.region.factory_class"属性为您创建的DistributeQueryCacheHazelcastFactory。
5 - 在分布式缓存中缓存查询:
query.unwrap(org.hibernate.Query.class).setCacheable(真); query.unwrap(org.hibernate.Query.class).setCacheRegion(" cacheName&#34)的
缓存区域将是Hazelcast分布式缓存中为此查询创建的地图的名称。
注意每个查询缓存的大小。
享受!
答案 2 :(得分:0)
正如@LuísOtávioBraga所建议的,我实现了一个使用hazelcast分发hibernate查询缓存的解决方案。 完成答案有几个不同之处和更多信息:
DistributedQueryCacheDataRegion 实现了QueryResultsRegion,但扩展了
AbstractGeneralRegion<IMapRegionCache>
buildQueryResultsRegion()方法的实现是:
@Override
public QueryResultsRegion buildQueryResultsRegion(String regionName, Properties properties) throws CacheException {
return new DistributedQueryCacheDataRegion(instance, regionName, properties, new IMapRegionCache(regionName,
instance, properties, null));
}
完整的代码是:
AbstractHazelcastCacheRegionFactory 与hibernate相同,只有非最终 buildQueryResultsRegion()。
DistributeQueryCacheHazelcastFactory:
/**
* Similar to com.hazelcast.hibernate.HazelcastCacheRegionFactory, only differences:
* 1. Extends our own implementation of AbstractHazelcastCacheRegionFactory.
* 2. Override buildQueryResultsRegion() to return DistributedQueryCacheDataRegion (that's why we needed our own
* implementation of AbstractHazelcastCacheRegionFactory to be able to override).
*
*/
public class DistributeQueryCacheHazelcastFactory extends AbstractHazelcastCacheRegionFactory {
private static final long serialVersionUID = 1L;
public DistributeQueryCacheHazelcastFactory() {
super();
}
public DistributeQueryCacheHazelcastFactory(final HazelcastInstance instance) {
super(instance);
}
public DistributeQueryCacheHazelcastFactory(final Properties properties) {
super(properties);
}
@Override
public QueryResultsRegion buildQueryResultsRegion(String regionName, Properties properties) throws CacheException {
return new DistributedQueryCacheDataRegion(instance, regionName, properties, new IMapRegionCache(regionName,
instance, properties, null));
}
@Override
public CollectionRegion buildCollectionRegion(final String regionName, final Properties properties,
final CacheDataDescription metadata) throws CacheException {
return new HazelcastCollectionRegion<IMapRegionCache>(instance, regionName, properties, metadata,
new IMapRegionCache(regionName, instance, properties, metadata));
}
@Override
public EntityRegion buildEntityRegion(final String regionName, final Properties properties,
final CacheDataDescription metadata) throws CacheException {
return new HazelcastEntityRegion<IMapRegionCache>(instance, regionName, properties, metadata,
new IMapRegionCache(regionName, instance, properties, metadata));
}
@Override
public TimestampsRegion buildTimestampsRegion(final String regionName, final Properties properties)
throws CacheException {
return new HazelcastTimestampsRegion<IMapRegionCache>(instance, regionName, properties, new IMapRegionCache(
regionName, instance, properties, null));
}
}
DistributedQueryCacheDataRegion:
public class DistributedQueryCacheDataRegion extends AbstractGeneralRegion<IMapRegionCache> implements
QueryResultsRegion {
protected DistributedQueryCacheDataRegion(HazelcastInstance instance, String name, Properties props,
IMapRegionCache cache) {
super(instance, name, props, cache);
}
}
最后,需要将hibernate配置 hibernate.cache.region.factory_class 中的工厂更改为新的DistributeQueryCacheHazelcastFactory类。