1

アプリでキャッシングを機能させようとしていますが、実際に機能させるのに非常に苦労しています。少なくともアプリケーションのこの部分については、非常に複雑な構成を行っていないため、非常にイライラし、最終的には StackOverflow コミュニティの優しい慈悲に身を置く必要があります。

まず、今のところ、Spring 3.0 と Hibernate 3.6 で立ち往生しているため、新しい Spring 3.1 の @Cacheable アノテーションやその他すべてのものを使用することは、オプションではありません。

私たちのスタックのバージョンを件名に入れました。私たちが持っているのは、そのスタックの非常に典型的な構成です:

  • Hibernate エンティティは @Entity で、DAO は @Repository で、サービスは @Service で定義されているだけです。
  • トランザクション境界は @Transactional で設定されます
  • ehcache-core を pom.xml に追加し、次のプロパティを Hibernate プロパティ マップに追加して、キャッシュを追加しました。
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory</prop>

次に、 @Cacheアノテーションをエンティティ クラスに追加しました。次のようになります。

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "config")
public class Configuration extends AbstractHibernateEntity implements Serializable {

そして正直なところ、私は終わったと思っていました。キャッシングをとても簡単に設定してくれてありがとう!キャッシュがオンラインになると、ログに多くのメッセージが記録されました。それは素晴らしいことです!

キャッシングがオンラインになり、何もキャッシュされていないことが判明しただけです。私は 2 日間この問題に取り組んできましたが、オブジェクトがキャッシュされない理由がわかりません。ehcache.xmlに追加<cache name="..."/>して、 @Cacheアノテーションで領域を指定し、キャッシュ統計をチェックするなどしてみました。 net.sf.ehcacheorg.hibernate.cacheパッケージの両方にデバッグ ログを追加しました。これがオブジェクトをキャッシュに保存してそこにアクセスするのを妨げている理由がわかりません。

Web アプリケーションがキャッシュされていないことに気付いた後、依存ライブラリに戻り、それらもキャッシュされていないことに気付きました (キャッシングが単体テストを壊さないことを確認するために、単体テストにキャッシュを追加しました。ではありませんが、それは単にキャッシュされていないためかもしれません)。そのため、私は低レベルの依存関係の 1 つに取り組んでおり、そのレベルで機能させる方法を理解できれば、それを Web アプリ レベルに引き上げることができると考えています。それは素晴らしい理論ですが、私はそれをより低いレベルで機能させることさえできません!

私のログには、たくさんのメッセージが表示されています。net.sf.ehcacheからのデバッグ出力のサンプルを次に示します。

14:03:20,795  INFO                           net.sf.ehcache: 284 - CACHE HITS:  0
14:03:20,796  INFO                           net.sf.ehcache: 284 - IN-MEM HITS: 0
14:03:20,796  INFO                           net.sf.ehcache: 284 - CACHE MISS:  0
14:03:20,796  INFO                           net.sf.ehcache: 284 - IN-MEM MISS: 0
14:03:20,796  INFO                           net.sf.ehcache: 284 - EVICTIONS:   0
14:03:20,797  INFO                           net.sf.ehcache: 284 - MEM OBJ CT:  0
14:03:20,886 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643835231789056
14:03:20,890 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643835231805440
14:03:20,891 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643834986045441
14:03:20,891 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643834986045441
14:03:20,897 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643835231834112
14:03:20,898 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643835231838208
14:03:20,898 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643834986078209
14:03:20,899 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643834986078209

org.hibernate.cacheログには、次のようなものがたくさんあります。

14:47:26,077 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration_data]
14:47:26,081 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration]
14:47:26,082 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration_data], timestamp: 5643845820751872
14:47:26,082 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration], timestamp: 5643845820751872
14:47:26,089 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration_data]
14:47:26,091 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration]
14:47:26,092 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration_data], timestamp: 5643845820792832
14:47:26,092 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration], timestamp: 5643845820792832
14:47:26,125 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration_data]
14:47:26,130 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration]
14:47:26,131 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration_data], timestamp: 5643845820952576
14:47:26,132 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration], timestamp: 5643845820952576

ここからそれについて他に何を言うべきか本当にわかりません。完全なコードは、https://bitbucket.org/rherrick/nrg_config の Bitbucket リポジトリ (git ではなく Mercurial)から、またはhttps://dl.dropboxusercontent.com/u/42711610/の Dropbox から zip として入手できます。 nrg_config.zip . 以下を使用して、Maven から単体テストを実行できるはずです。

mvn clean install

ここで一体何がうまくいかないのかを誰かが理解するのを手伝ってくれたら、私は有頂天に幸せになるでしょう! そして、あなたは私が恍惚とした幸せになってほしくないですか?私は知っています:)

真剣に、前もって多くの感謝をし、この問題について助けてくれた後に多くの感謝をします.

4

2 に答える 2

1

私が理解している限り、オブジェクトの二次キャッシュはload getlistなどを呼び出す場合にのみ使用されSessionます。私はあなたのコードでそのような呼び出しを見ることができません。

クエリ キャッシュは、呼び出しまたはオブジェクトの場合にのみ使用されsetCacheableます。繰り返しますが、コード内でそのメソッドを呼び出すことはありません。QueryCriteria

于 2013-09-04T19:49:11.417 に答える
0

アレクサンダー、

あなたは正しい道を進んでいますが、それは問題を引き起こしたいくつかの要因の 1 つにすぎません。実際には次の 3 つの要因がありました。

  1. 私たちのコードは実際には load()、get()、list() などを呼び出していますが、ほとんどがフレームワーク コードに含まれています。私はそこにキャッシュを明示的に強制するために、そのコードの束を調べてテンプレート化しました。それはいくつかのキャッシングを開始しました。
  2. JPA/Hibernate エンティティは、何も初期化しないでください。インスタンス化時にいくつかのフラグとタイムスタンプを設定する基本クラスがありました。オブジェクトが取得されると、オブジェクトが汚れたように見え、データベースへの完全な実行が必要になりました。これは、私たちのフレームワークにとって本当に大きなものでした。
  3. 一時的なプロパティを設定するときは、トランザクションの境界に注意してください。@Transactional とマークされたメソッドに出入りすると、ここで説明するように、そのオブジェクトで session.save() を呼び出したかどうかに関係なく、オブジェクトへのすべての変更が永続化されます。これにより、オブジェクトがキャッシュされたバージョンとの一致に常に失敗していました (ただし、オブジェクトの変更されたバージョンはキャッシュと一致すると考えていましたが、そうはならなかったようです)。

最終的に、これは主に 1 つの要因ではなく、さまざまな要因が組み合わさって発生したため、診断が非常に困難になりました。

于 2013-09-05T20:08:10.987 に答える