如何使用Hibernate进行分布式查询缓存?

时间:2014-12-22 11:15:23

标签: hibernate caching distributed

我成功地将Hazelcast用作Hibernate的L2分布式缓存。看起来查询缓存没有分布式。是不是可以为'hibernate查询缓存'使用分布式缓存?或者我是否缺少配置以确保“查询缓存”也是分布式的? 使用Hazelcast 3.2.6和Grails 2.2.3。

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查询缓存的解决方案。 完成答案有几个不同之处和更多信息:

  1. 我将 AbstractHazelcastCacheRegionFactory 复制到我自己的文件中,只是更改了 buildQueryResultsRegion()方法,而不是最终方法。这使我能够进行(相对)简单的未来升级,因为我知道唯一的变化是单一方法的一个修饰符。
  2. DistributedQueryCacheDataRegion 实现了QueryResultsRegion,但扩展了

    AbstractGeneralRegion<IMapRegionCache>
    
  3. buildQueryResultsRegion()方法的实现是:

    @Override
    public QueryResultsRegion buildQueryResultsRegion(String regionName, Properties properties) throws CacheException {
        return new DistributedQueryCacheDataRegion(instance, regionName, properties, new IMapRegionCache(regionName,
                instance, properties, null));
    }
    
  4. 完整的代码是:

    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类。