当前位置: 首页 > 知识库问答 >
问题:

使用spring Cache缓存属性

方和顺
2023-03-14

我正在尝试使用spring Cache实现对我的方法的缓存。问题是第一次执行后这个方法没有被执行,这意味着属性没有被加载。如果我删除@cacheable注释,它工作得很好。我的要求是,每当添加新属性时,这个方法才应该运行并加载属性,否则它应该从缓存返回

 @Cacheable("mycache")
public Properties loadPropertyFile() throws Throwable {
    Properties properties = new Properties();
    try {
        logger.debug("Loading properties.");
        if (this.locations != null) {

            for (Resource location : this.locations) {
                if (logger.isInfoEnabled()) {
                    logger.info("Loading properties file from " + location);
                }
                try {
                    properties = PropertiesLoaderUtils.loadAllProperties(location.getFilename());

                } catch (IOException ex) {
                    if (this.ignoreResourceNotFound) {
                        if (logger.isWarnEnabled()) {
                            logger.warn("Could not load properties from "
                                    + location + ": " + ex.getMessage());
                        }
                    } else {
                        throw ex;
                    }
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return properties;
}

XML文件:

 <cache:annotation-driven />


<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
  <set>
    <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="mycache" />
  </set>
</property>

共有1个答案

江佐
2023-03-14

代码工作正常:按照您配置cacheable注释的方式,它实际上永远不会失效,因为没有触发驱逐的条件。通常,您可以使用condition参数并向其传递一个SPeL表达式,但仍然无法检查基础文件是否已更改并有条件地执行method body。

“cache until changed”的实现无法工作,因为在实际重新加载文件之前(或者检查文件的大小或时间戳),您不知道是否添加了“new property”。

如果定期重新加载是一种可接受的替代方法,那么您可以尝试Apache Commons Configurations的ReloadingFileBasedConfigurationBuilder或使用Spring的@schedule进行试验。

 类似资料:
  • 问题内容: 我的任务是利用SpringCache作为我们的一项服务,以减少数据库查找的次数。在测试实现时,我注意到一些可缓存操作通过日志语句多次调用。调查显示,如果在可缓存的方法中调用了可缓存的操作,则嵌套操作根本不会被缓存。因此,嵌套操作的后续调用将导致进一步的查找。 下面列出了描述问题的简单单元测试: 这两种方法的实际工作对于测试用例本身并不重要,因为仅应测试缓存。 我以某种方式理解了为什么不

  • 本文向大家介绍浅谈SpringCache与redis集成实现缓存解决方案,包括了浅谈SpringCache与redis集成实现缓存解决方案的使用技巧和注意事项,需要的朋友参考一下 缓存可以说是加速服务响应速度的一种非常有效并且简单的方式。在缓存领域,有很多知名的框架,如EhCache 、Guava、HazelCast等。Redis作为key-value型数据库,由于他的这一特性,Redis也成为一

  • classpath : herosphp\cache\CacheFactory herophp的缓存是通过缓存工厂来管理的,CacheFactory 负责创建缓存,默认采用的是单例模式,也就是同一类型的缓存在应用中只会存再一个实例。 $cacher = CacheFactory::create('file', true); 我们为缓存工具定义了一个 ICache接口,它定义了以下接口方法: get

  • 我试图将Redis与Spring的一起使用,但需要根据Spring Boot风格的应用程序属性有条件地打开或关闭缓存。我的第一次尝试似乎不起作用。 application.properties文件: properties类: 服务方法注释: 结果如下: 有没有人知道问题出在哪里,或者有没有其他的方法可以达到这个目的?

  • MiniFramework 支持三种缓存方式,分别是:Memcached、Redis 和 File(磁盘文件存储)。 Memcached $cache = \Mini\Cache::factory ('Memcache', array ( 'host' => 'localhost', //主机 'port' => 11211

  • 问题内容: 我正在用python写一个类,并且我有一个属性,该属性将花费相对较长的时间来计算,因此 我只想执行一次 。此外,它会不会被类的每个实例需要的,所以 我不想在默认情况下做到这一点 在。 我是Python的新手,但不是编程人员。我可以想出一种很容易做到这一点的方法,但是我一遍又一遍地发现,“ Pythonic”做事的方法通常比我在其他语言中的经验要简单得多。 在Python中是否有“正确”