java – 调用@Cacheable方法的多个线程. Spring cache(3.2.6)允许所有线程进入该方法

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

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

遵循我的Spring应用程序上下文文件的XML配置.这是一个Web应用程序.我使用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>

最佳答案 我只能找到一些文档告诉我你所描述的行为是一个错误.然而,有一个模糊的暗示,它将在(
http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/html/cache.html)提供的文件中

This way, expensive methods (whether CPU or IO bound) can be executed only once for a given set of parameters and the result reused without having to actually execute the method again

“can”在这里是一个有问题的词,因为它可能意味着方法执行“不能多次执行”或者“只能执行一次”

我建议你描述的行为不是一个错误,而是一个功能性的“缺点”.对于同一组参数,防止对该方法执行多次似乎是一种简单的方法来编写死锁.

我没有答案,我希望有人会纠正我的假设(因为所描述的行为是非常有问题的).

点赞