java - 多个线程调用@Cacheable 方法。 Spring 缓存(3.2.6)允许所有线程进入方法

标签 java multithreading spring caching

我有一个具有以下类型方法的 DAO 对象。我已将 DAO 注入(inject)服务层,并且能够从此 DAO 方法调用中获取缓存结果。但是当多个线程调用此方法时(在包装 DAO 单例的代理上),其中一些线程仍然会从我的数据库中获取数据,即 fetchDataFromDb() 方法调用仍然会被执行。有办法解决这个问题吗?这是 Spring 缓存错误吗?

    @Override
    @Cacheable(value = "CacheName")
    public Map<String, DomainObject> fetchDataFromDb() {
    ....
    }

以下是我的 Spring 应用程序上下文文件的 XML 配置。这是一个网络应用程序。我使用 JMeter 模拟了多个线程。

<cache:annotation-driven />


<!-- generic cache manager -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
    <property name="caches">
        <set>
            <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="CacheName" />              
        </set>
    </property>
</bean>

最佳答案

你想要的是@Cacheable(sync = true)

关于java - 多个线程调用@Cacheable 方法。 Spring 缓存(3.2.6)允许所有线程进入方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21467439/

相关文章:

java - 严重 : Context initialization failed org. springframework.beans.factory.BeanCreationException:创建名称为 'sessionFactory' 的 bean 时出错

java - 在 PHP 代码中运行 Java 程序

java - Android 中的异步套接字

java - Spring MVC Controller 未加载

java - 线程运行时按钮 onClick() 不起作用

java - 我如何实现文件扫描器的多线程场景?

Java:从另一个线程停止一个线程中的所有 Activity

java - Java 的 WS-Discovery 实现

java - Spring 启动: automatic JSON message converter for @Requestbody GET doesn't work

java - Spring Mockito - Junit Controller 测试 - 模拟一项服务