Hibernate2級レベルのキャッシュ無効の場合別のプロセス変数を変更する機能を提供するデータベース

StackOverflow https://stackoverflow.com/questions/1603846

質問

して他のアプリケーションに対する使用、Hibernateの2ndレベルのキャッシュを避けるデータベースのオーサリングツールです。

破壊も修復もおもしろくないも容易を無効にするには、JavaアプリケーションのHibernate2級レベルのキャッシュが社外処理などの管理者がMySQLに直接変更のデータベースの更新を挿入、削除を押します。-

を用いて EHCache として、2級レベルのキャッシュの実装です。

を使用していまミックスの@キャッシュを利用=CacheConcurrencyStrategy.READ_WRITE)、@キャッシュを利用=CacheConcurrencyStrategy.NONSTRICT_READ_WRITEしないオプティミスティック並行制御能を使用タイムスタンプなどの各団体をいう。

にSessionFactoryを含む管理方法には2級レベルのキャッシュ:- 管理、キャッシュ

sessionFactory.evict(Cat.class, catId); //evict a particular Cat
sessionFactory.evict(Cat.class);  //evict all Cats
sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections

そして注釈を付け個別主体の授業を@にキャッシュが中央会場を"確実に"などアステップ)を追加します。

// Easy to forget to update this to properly evict the class
public static final Class[] cachedEntityClasses = {Cat.class, Dog.class, Monkey.class}

public void clear2ndLevelCache() {
  SessionFactory sessionFactory = ...   //Retrieve SessionFactory

   for (Class entityClass : cachedEntityClasses) {
       sessionFactory.evict(entityClass);
   }
}

ありませんようがないために、Hibernateの2ndレベルのキャッシュを知る主体の変更はDBではないとするクエリの実体は何のキャッシュを保護す)。うソリューションとしてこの話はなんらかの方法では第二レベルのキャッシュに立ち退かせあしないので、ロックおよび並行処理制御すリスク進行中の取引からの"読み"もしくは更新を無効とします。

役に立ちましたか?

解決

に基づく ChssPly76の コメントここの方法evictsすべての事業体からの2ndレベルのキャッシュ(できる場所には置かないでください方法を管理者によJMXまたはその他の管理ツール):

/**
 * Evicts all second level cache hibernate entites. This is generally only
 * needed when an external application modifies the game databaase.
 */
public void evict2ndLevelCache() {
    try {
        Map<String, ClassMetadata> classesMetadata = sessionFactory.getAllClassMetadata();
        for (String entityName : classesMetadata.keySet()) {
            logger.info("Evicting Entity from 2nd level cache: " + entityName);
            sessionFactory.evictEntity(entityName);
        }
    } catch (Exception e) {
        logger.logp(Level.SEVERE, "SessionController", "evict2ndLevelCache", "Error evicting 2nd level hibernate cache entities: ", e);
    }
}

他のヒント

SessionFactory たっぷりの evict() 方法を正確にその目的:

sessionFactory.evict(MyEntity.class); // remove all MyEntity instances
sessionFactory.evict(MyEntity.class, new Long(1)); // remove a particular MyEntity instances

両hibernate JPA現に直接アクセスする2ndレベルのキャッシュ:

sessionFactory.getCache().evict(..);
entityManager.getCache().evict(..)

探していましたかを無効とすべてのHibernateのキャッシュやすことに有のスニペット:

sessionFactory.getCache().evictQueryRegions();
sessionFactory.getCache().evictDefaultQueryRegion();
sessionFactory.getCache().evictCollectionRegions();
sessionFactory.getCache().evictEntityRegions();

希望です。

てみるのも良いでしょうこ:

private EntityManager em;

public void clear2ndLevelHibernateCache() {
    Session s = (Session) em.getDelegate();
    SessionFactory sf = s.getSessionFactory();

    sf.getCache().evictQueryRegions();
    sf.getCache().evictDefaultQueryRegion();
    sf.getCache().evictCollectionRegions();
    sf.getCache().evictEntityRegions();

    return;
}

あなたにとってどんな年でした役立っています。

気をつけなければいけないの考慮が分散キャッシュはQueryCacheは、退去も一ノードになevictsからです。もう一つの問題-退去又は地域ずに退去クエアがN+1を選択し、を取り出そうとすると日付から照会します。良い読みがこのトピック こちらの.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top