[解決済み] 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
プロキシを経由して入ってくる外部メソッド呼び出しだけが を傍受する。つまり、自己呼び出し、事実上メソッド ターゲットオブジェクトの中で、ターゲットオブジェクトの別のメソッドを呼び出す。 は、実行時に実際のキャッシュ遮断につながらない。 でマークされているメソッドを呼び出します。
関連
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
IDEA パッケージステートメントの欠落
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
[解決済み] クライアントにJavaScriptファイルを強制的に更新させるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.util.NoSuchElementException 原因解析と解決方法
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
自動配線された依存性のインジェクションに失敗しました。
-
[オリジナル】java学習ノート【II】よくあるエラー クラスパス上のクラスファイルが見つからない、またはアクセスできない場合
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)