1. ホーム
  2. java

[解決済み] Spring Cache @Cacheable - 同じBeanの別のメソッドから呼び出されたときに動作しない。

2022-04-27 20:12:52

質問

同じBeanの別のメソッドからキャッシュされたメソッドを呼び出すと、Springキャッシュが機能しない。

以下は、私の問題をわかりやすく説明するための例です。

コンフィギュレーションです。

<cache:annotation-driven cache-manager="myCacheManager" />

<bean id="myCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
    <property name="cacheManager" ref="myCache" />
</bean>

<!-- Ehcache library setup -->
<bean id="myCache"
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:shared="true">
    <property name="configLocation" value="classpath:ehcache.xml"></property>
</bean>

<cache name="employeeData" maxElementsInMemory="100"/>  

キャッシュされたサービス:

@Named("aService")
public class AService {

    @Cacheable("employeeData")
    public List<EmployeeData> getEmployeeData(Date date){
    ..println("Cache is not being used");
    ...
    }

    public List<EmployeeEnrichedData> getEmployeeEnrichedData(Date date){
        List<EmployeeData> employeeData = getEmployeeData(date);
        ...
    }

}

結果:

aService.getEmployeeData(someDate);
output: Cache is not being used
aService.getEmployeeData(someDate); 
output: 
aService.getEmployeeEnrichedData(someDate); 
output: Cache is not being used

があります。 getEmployeeData メソッドコールがキャッシュを使用 employeeData を2回目に呼び出すと、予想通り しかし getEmployeeData メソッドの中で呼び出されます。 AService クラス(in getEmployeeEnrichedData ) の場合、Cache は使用されません。

スプリングキャッシュはこのように動作するのでしょうか、それとも何か見逃しているのでしょうか?

解決方法は?

このような仕組みになっていると思います。 私が読んだ記憶では、すべてのリクエストを傍受し、キャッシュされた値で応答するプロキシクラスが生成されますが、同じクラス内の「内部」呼び出しはキャッシュされた値を取得しません。

から https://code.google.com/p/ehcache-spring-annotations/wiki/UsingCacheable

プロキシを経由して入ってくる外部メソッド呼び出しだけが を傍受する。つまり、自己呼び出し、事実上メソッド ターゲットオブジェクトの中で、ターゲットオブジェクトの別のメソッドを呼び出す。 は、実行時に実際のキャッシュ遮断につながらない。 でマークされているメソッドを呼び出します。