首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >缓存中的EHCACHE 3.x弹簧引导号

缓存中的EHCACHE 3.x弹簧引导号
EN

Stack Overflow用户
提问于 2019-12-14 23:46:47
回答 1查看 1.5K关注 0票数 0

我正在尝试使用ehcache。

代码语言:javascript
运行
复制
@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
      public JCacheCacheManager jCacheCacheManager() throws IOException {
        return new JCacheCacheManager(cacheManager());
      }

      @Bean(destroyMethod = "close")
      public javax.cache.CacheManager cacheManager() throws IOException {
        XmlConfiguration xmlConfig = new XmlConfiguration(new ClassPathResource("ehcache.xml").getURL());
        EhcacheCachingProvider provider = (EhcacheCachingProvider) Caching.getCachingProvider();
        return provider.getCacheManager(provider.getDefaultURI(), xmlConfig);

      }
    }
代码语言:javascript
运行
复制
@Service
public class AvengersService {


    @Cacheable(cacheNames="avengers" , key="#id")
    public List<String> getAvengers(String id) {
        System.out.println("Loading avengers");
        return Arrays.asList(id.toString(),"Captain America", "Hulk", "Iron Man", "Thor");
    }

}
代码语言:javascript
运行
复制
@SpringBootApplication
@ComponentScan
public class DemoApplication   {

    @Autowired
    private CacheManager cacheManager;

    @Autowired
    private AvengersService avengersService;

    public static void main(String[] args) {


          //list all the caching provider
        Iterator<CachingProvider> iterator = Caching.getCachingProviders(Caching.getDefaultClassLoader()).iterator();
        while(iterator.hasNext()) {
            CachingProvider provider = iterator.next();
            System.out.println(provider);
            if ((provider instanceof HazelcastCachingProvider)) {
                iterator.remove();
            }
        }

        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {

            JCacheCache cache = (JCacheCache) cacheManager
                    .getCache("avengers");

        for(Long i=1L;i<50001;i++) {
            List<String> t=avengersService.getAvengers(String.valueOf(i)+"a");
        cache.put(String.valueOf(i)+"a", avengersService.getAvengers(String.valueOf(i)+"a"));
        }
        System.out.println();

        Cache<Object, Object>    e= ( cache.getNativeCache());
        Iterator<Cache.Entry<Object, Object>> iterator = ( e).iterator();
        int count=1;
        while (iterator.hasNext()) {
            Cache.Entry<Object, Object> t = iterator.next();
            count++;
            System.out.println("key :" + t.getKey() + " value " + t.getValue());
        }


        System.out.println(count);

        final MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();

        final Set<ObjectInstance> cacheBeans = beanServer.queryMBeans(ObjectName.getInstance("javax.cache:type=CacheStatistics,CacheManager=*,Cache=*"), null);

        for ( ObjectInstance cacheBean : cacheBeans ) {
            final CacheStatisticsMXBean cacheStatisticsMXBean = MBeanServerInvocationHandler.newProxyInstance(beanServer, cacheBean.getObjectName(), CacheStatisticsMXBean.class, false);

            System.out.println("Gets: " + cacheStatisticsMXBean.getCacheGets());
            System.out.println("Hits: " + cacheStatisticsMXBean.getCacheHits());
            System.out.println("Misses: " + cacheStatisticsMXBean.getCacheMisses());
            System.out.println("Removals: " + cacheStatisticsMXBean.getCacheRemovals());
            System.out.println("Evictions: " + cacheStatisticsMXBean.getCacheEvictions());
            System.out.println("Avg Get Time: " + cacheStatisticsMXBean.getAverageGetTime());
            System.out.println("Avg Put Time: " + cacheStatisticsMXBean.getAveragePutTime());
            System.out.println("Avg Remove Time: " + cacheStatisticsMXBean.getAverageRemoveTime());
        }
        };
    }

}
代码语言:javascript
运行
复制
public class MyCacheEntryListener<K, V> implements CacheEventListener<K, V>, Serializable {

    @Override
    public void onEvent(CacheEvent<? extends K, ? extends V> event) {
        // TODO Auto-generated method stub

        if (EventType.UPDATED == event.getType()) {
            System.out.println("Received a " + event);
        }
    }

}
代码语言:javascript
运行
复制
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.ehcache.org/v3"
    xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
    xsi:schemaLocation="
            http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
            http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">

 <service>
      <jsr107:defaults enable-management="true" enable-statistics="true"/>
  </service>
    <cache alias="avengers">
        <key-type>java.lang.String</key-type>
        <value-type>java.util.Arrays$ArrayList</value-type>
        <expiry>
             <none/>
        </expiry>
 <listeners>
            <listener>
                <class>com.example.demo.MyCacheEntryListener</class>
                <event-firing-mode>ASYNCHRONOUS</event-firing-mode>
                <event-ordering-mode>UNORDERED</event-ordering-mode>
                <events-to-fire-on>UPDATED</events-to-fire-on>
            </listener>
        </listeners>
        <resources>
            <heap unit="entries">2</heap>
            <offheap unit="MB">10</offheap>
        </resources>
    </cache>

</config>
代码语言:javascript
运行
复制
spring.cache.jcache.config=classpath:ehcache.xml

区块报价

在启动我的应用时,它的prints 2缓存提供程序。

HazelcastCachingProvider{delegate=HazelcastServerCachingProvider{hazelcastInstance=null}} org.ehcache.jsr107.EhcacheCachingProvider@1f57539

  1. 为什么初始化2缓存提供程序?
  2. ,如果默认情况下,我如何禁用这些?
  3. ,我在缓存中添加了50000对象,但是在迭代它时,我只得到"36406“对象,为什么?
EN

回答 1

Stack Overflow用户

发布于 2019-12-15 00:03:34

这里有很多移动部件。不需要配置CacheManager,它是使用spring.cache.jcache.config属性自动完成的。删除两个@Bean方法。

如果您需要访问javax.cache.CacheManager,您可以注入JCacheCacheManager,它将允许您访问它包装的本机JCacheCacheManager

类路径上有几个JSR107实现,因此API调用提供了可用的东西,这是Spring无法控制的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59340129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档