【发布时间】:2014-01-30 21:09:30
【问题描述】:
我有一个带有以下类型方法的 DAO 对象。我已将 DAO 注入服务层,并且能够从此 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>
【问题讨论】:
-
我们可以看看你的 DAO bean 定义吗?是否与缓存配置在同一个上下文中?
-
您必须在包含 fetchDataFromDb() 方法的类中具有其他方法。确保他们都没有调用 fetchDataFromDb()
-
DAO bean 定义是一个很普通的定义,它连接到数据库并获取一些数据。
-
我没有直接调用 fetchDataFromDb(),我总是通过 Spring 给定的 bean(我的意思是通过动态代理)。
标签: java multithreading spring caching