5

Spring 3.0 RC1 のキャッシュ抽象化メカニズムを使用しています。バイトコード (AspectJ ベース) をセットアップして、クラス自体から呼び出されるメソッドにキャッシュ メカニズムを適用できるようにしました。最初にプロキシベースのアプローチを使用していたことは言うまでもありません: すべてが正常に機能していました (メソッドが別のオブジェクトから呼び出されるため)。

AspectJ に切り替えるとすぐに (を介して LTW を有効にし、適切な jar をその場所に追加しました - すべて正常に動作し、例外はスローされません)、キャッシュは行われません。

なにか提案を?ありがとうございました。

====後で編集========

org.springframework の DEBUG にログを設定しました。

プロキシ モードを使用している場合は、「Adding cacheable method 'getLargeAssetContent'....」というメッセージがはっきりと表示されます。ここで、getLargeAssetContent は私の「キャッシュ可能な」メソッドです... (以下を参照してください)

アスペクトモードを使用している場合、このメッセージは表示されません....すべてのリクエストはDAOレイヤーに送られます...キャッシュが機能する状況では、リクエストはサービスレイヤーで停止します。

私が間違っていることは何ですか?aop.xml は必要ですか? AOP を使用していなかったので、aop.xml はまだありません。

ご協力ありがとうございました。

*> *2011-12-12 16:38:55,998 DEBUG [org.springframework.cache.annotation.AnnotationCacheOperationSource]

(http-127.0.0.1-8080-6) 次の属性を持つキャッシュ可能メソッド「getLargeAssetContent」を追加: [CacheOperation[public com.mycompany.myprj.model.AssetContent com.mycompany.myprj.dao.jcr.AssetDAOImpl.getLargeAssetContent(java.lang) .String) com.mycompany.myprj.dao.MyPrjPersistenceException をスローします] caches=[assets] | 条件='' | key='#nodeId'] 2011-12-12 16:38:56,013 INFO [com.mycompany.myprj.dao.jcr.AssetDAOImpl] (http-127.0.0.1-8080-6) アセットのコンテンツ (getLargeAssetContent) の取得id=575d8dc0-01be-41e4-85ce-a654fab97fe8 2011-12-12 16:38:56,092 INFO [com.mycompany.myprj.dao.jcr.AssetDAOImpl] (http-127.0.0.1-8080-6) のノードからid=575d8dc0-01be-41e4-85ce-a654fab97fe8** のノードからのアセットのコンテンツ

*

//コンテンツは現在キャッシュされています 2011-12-12 16:38:57,654 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] ​​(http-127.0.0.1-8080-6) シングルトン Bean のキャッシュされたインスタンスを返す ' assetController' 2011-12-12 16:38:57,654 DEBUG [org.springframework.web.servlet.DispatcherServlet] (http-127.0.0.1-8080-6) Last-Modified value for [/myprj/asset/get/575d8dc0- 01be-41e4-85ce-a654fab97fe8] は: -1 2011-12-12 16:38:57,654 INFO [com.mycompany.myprj.services.AssetService] (http-127.0.0.1-8080-6) id のアセットを取得しています: 57

*

4

2 に答える 2

1

AspectJ モードが有効になっていることを確認します (「28.3.3 キャッシング アノテーションを有効にする」を参照)。

<cache:annotation-driven mode="aspectj"/>

デフォルトでは、キャッシング抽象化はproxy、LTW が有効になっているにもかかわらずモードを使用します (自動的に IMHO に切り替える必要aspectjがありますが、そうではありません)。

キャッシュされたメソッドを外部と内部から呼び出すときにこれがスタック トレースの調査に役立たない場合、違いは何ですか?

于 2011-12-08T12:43:48.493 に答える
0

サンプルプロジェクトで試してみたところ、通常のプロキシからaspectj LTWに切り替えるには、次のことを行う必要がありました

  • 変化する<cache:annotation-driven mode="aspectj"/>
  • spectj-weaver と spring-aspects をクラスパスに追加します (ClassNotFoundException がスローされても簡単に識別できます)。
  • META-INF/aop.xml にデフォルトの aop.xml があります (これはデフォルト設定であり、特定のパッケージのクラスをプロキシするように構成されています。それ以外の場合は、JVM 全体でクラスをプロキシします。これを呼び出す必要があります。 )
  • 追加<context:load-time-weaver aspectj-weaving="on"/>(デフォルトは autodetect で、META-INF/aop.xml が見つからない場合は黙って失敗します)
  • スイッチを VMに追加し、javaagentスタンドアロンで使用している場合は spring-instrument jar をポイントします。コンテナ内にいる場合は、javaagent を使用するか、リファレンスに記載されているように特定のクラスローダーに設定することができます。
于 2013-01-10T03:13:43.763 に答える