1

いくつかのキャッシュ関連の Hibernate に関する質問:

  1. L1 キャッシング (セッションベースのキャッシング) では、セッションが閉じるとすぐにキャッシュが削除/クリアされます。しかし、L2 キャッシング (アプリケーション/グローバル/分散キャッシング) では、いつキャッシュがドロップ/クリア/フラッシュされるのでしょうか? L2 キャッシュを手動/プログラムでクリア/フラッシュする方法はありますか?
  2. EhCacheCacheProviderL2 キャッシュにはを指定できます。ただし、EhCache ではehcache.xml、キャッシュを構成するためにランタイム クラスパスに構成ファイルが必要です。で微調整するために使用できる Hibernate L2 キャッシュの特定の名前はありehcache.xmlますか?
  3. プログラム A が Hibernate で管理されたエンティティ (永続的な状態の POJO) を使用しているため、Hibernate によってアクティブに管理/追跡されており、別のアプリケーション (プログラム B) が同じレコードを更新している場合、Hibernate は自動的に in- を更新しますか?メモリ POJO? たとえば、私のfizz.warWeb アプリは MySQL サーバーに接続しており、永続的なUserインスタンス ( usersMySQL のテーブルに対応) を管理しています。現在、このユーザーのメール アドレスはjohn.smith@example.comです。次に、同時にbuzz.war(別の Web アプリ) が同じusersレコードの電子メールを に更新しますjane.smith@example.com。HibernateUserは更新を含むようにインスタンスを自動的に更新しますか?
4

1 に答える 1

0

#1について、いくつかの考え:

  • 時間 (timeToLive、TimeToIdle) または容量 (MaxelementInMemory) エビクションなどの概念を使用して、基礎となるキャッシュ実装 (つまり、ehcache) にエビクションを実行させます...
  • hibernate 3.x を使用している場合は、sessionFactory オブジェクトから evit*() メソッドに直接アクセスできます。
  • または、Hibernate 4.x を使用している場合は、org.hibernate.Cache インターフェイスの一部として evict*() メソッドを使用できます (SesisonFactory からのメソッドはまだ存在しますが、非推奨です)( http://docs .jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/Cache.html#evictEntity(java.lang.String,%20java.io.Serializable)...たとえば、すべてのエンティティをキャッシュ領域:

    sessionFactory.getCache().evictEntityRegion(entitClass);

  • 最後に、基礎となる Cache 実装にさらに結び付けられています (したがって、あまりお勧めしません): ehcache CacheManager オブジェクト (通常はシングルトン) のハンドルを取得し、その方法でエントリを削除できます...

    CacheManager.getInstance().clearAll();

また

//remove things from a specific cache
CacheManager.getInstance().getCache("cache").remove();

#3の場合、いいえ、休止状態は、基礎となるDBバックエンドが別のアプリによって更新されているかどうかを認識しません(したがって、外部で更新されたエンティティのl2キャッシュをクリアできません)...これは#1に戻ります...buzz.war エンティティの更新から L2 キャッシュをインテリジェントにクリアする必要があります (ehcache + terracotta などの分散キャッシュを使用している場合は可能です...)

それが役立つことを願っています。

于 2013-07-25T20:21:35.263 に答える