アプリでキャッシングを機能させようとしていますが、実際に機能させるのに非常に苦労しています。少なくともアプリケーションのこの部分については、非常に複雑な構成を行っていないため、非常にイライラし、最終的には 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.ehcacheとorg.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
ここで一体何がうまくいかないのかを誰かが理解するのを手伝ってくれたら、私は有頂天に幸せになるでしょう! そして、あなたは私が恍惚とした幸せになってほしくないですか?私は知っています:)
真剣に、前もって多くの感謝をし、この問題について助けてくれた後に多くの感謝をします.