使用 Spring/MyBatis 了解 EhCache

Understanding EhCache with Spring/MyBatis

我正在将 EhCache 与 Spring 和 MyBatis 一起使用,需要一些关于 EhCache 工作原理的说明。我有以下用于 ehcache 的配置文件。

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false"
         monitoring="autodetect"
         dynamicConfig="true">

    <diskStore path="java.io.tmpdir" />

    <defaultCache maxElementsInMemory="10000"
                  eternal="false"
                  timeToIdleSeconds="300"
                  timeToLiveSeconds="600"
                  diskSpoolBufferSizeMB="30"
                  maxElementsOnDisk="10000"
                  diskExpiryThreadIntervalSeconds="120"
                  memoryStoreEvictionPolicy="LRU" statistics="false">
    </defaultCache>
</ehcache>

我只是在配置默认缓存。如果我在将此行添加到 MyBatis 映射器文件时理解正确,它会创建一个新缓存。

<cache type="org.mybatis.caches.ehcache.EhcacheCache" />

这让我想知道它是否继承了默认缓存的属性?如果不是,配置默认缓存的目的是什么?

最好的做法是为每个功能/数据创建一个缓存,还是一个大缓存?

我也在尝试摆脱 XML,所以我想知道这是否可以通过 Java 配置来完成?

我有以下 Java 配置,但似乎没有办法使用 Java 配置方法配置默认缓存,所以我想知道它的效果如何工作,它是否是与 MyBatis 一起工作的好选择?

@Configuration
@EnableCaching
public class CacheConfig implements CachingConfigurer {

    @Autowired
    Environment environment;

    @Bean(destroyMethod = "shutdown")
    public net.sf.ehcache.CacheManager ehCacheManager() {
        CacheConfiguration cacheConfiguration = new CacheConfiguration();
        cacheConfiguration.setName(environment.getRequiredProperty("ehcache.name"));
        cacheConfiguration.setMemoryStoreEvictionPolicy(environment.getRequiredProperty("ehcache.memoryStoreEvictionPolicy"));
        cacheConfiguration.setDiskExpiryThreadIntervalSeconds(environment.getRequiredProperty("ehcache.diskExpiryThreadIntervalSeconds", Integer.class));
        cacheConfiguration.setDiskSpoolBufferSizeMB(50);
        cacheConfiguration.setOverflowToDisk(true);
        cacheConfiguration.setDiskPersistent(true);
        cacheConfiguration.setMaxBytesLocalHeap("512000000");
        cacheConfiguration.setMaxBytesLocalDisk("2048000000");
        cacheConfiguration.eternal(false);
        cacheConfiguration.setTimeToIdleSeconds(1800);
        cacheConfiguration.setTimeToLiveSeconds(3600);
        cacheConfiguration.statistics(true);
        cacheConfiguration.logging(true);

        net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
        config.addCache(cacheConfiguration);

        return net.sf.ehcache.CacheManager.newInstance(config);
    }

    @Bean
    @Override
    public org.springframework.cache.CacheManager cacheManager() {
        return new EhCacheCacheManager(ehCacheManager());
    }

    @Override
    public CacheResolver cacheResolver() {
        return new SimpleCacheResolver();
    }

    @Override
    public KeyGenerator keyGenerator() {
        return new SimpleKeyGenerator();
    }

    @Override
    public CacheErrorHandler errorHandler() {
        return new SimpleCacheErrorHandler();
    }
}

如果你查看`org.mybatis.caches.ehcache.EhcacheCache的源代码,你会发现

  1. 它正在内部创建一个 CacheManager。也没有配置 class(Class 被标记为最终)的选项,因此我们可以让它使用 Spring 缓存管理器。

    对您来说最好的选择是使用 Spring 方法级缓存并停止考虑使用 org.mybatis.caches.ehcache.EhcacheCache

    进行缓存

    最好使用 spring 注释驱动的缓存,这意味着您不必使用一个大缓存,但可以为每种情况使用单独的缓存。