web-dev-qa-db-ja.com

Springを使用してすべてのHibernateキャッシュ(ehcache)をクリアする方法は?

2次キャッシュとクエリキャッシュを使用しています。プログラムですべてのキャッシュをクリアする方法を教えてもらえますか?

23
cometta

セッションキャッシュをクリアするには、session.clear()を使用します

2次キャッシュをクリアするには、 このコードスニペット を使用します。

18
Bozho

Bozhoの回答に示されているコードスニペットは、Hibernate 4では非推奨です。

Hibernate JavaDocによると、org.hibernate.Cache.evictAllRegions()を使用できます。

すべてのクエリ領域からデータを削除します。

APIの使用:

Session session = sessionFactory.getCurrentSession();

if (session != null) {
    session.clear(); // internal cache clear
}

Cache cache = sessionFactory.getCache();

if (cache != null) {
    cache.evictAllRegions(); // Evict data from all query regions.
}

または、特定のスコープからすべてのデータを消去できます。

org.hibernate.Cache.evictCollectionRegions()
org.hibernate.Cache.evictDefaultQueryRegion()
org.hibernate.Cache.evictEntityRegions()
org.hibernate.Cache.evictQueryRegions()
org.hibernate.Cache.evictNaturalIdRegions()

JavaDoc for hibernate Cacheインターフェース(Hibernate 4.3) を確認することをお勧めします。

また、 2次キャッシュの削除 hibernate dev guide(4.3)から。

32
Dino

Terracottaをプラグインする場合は、Terracotta Dev Consoleを実行して、キャッシュに関する統計を検査し、キャッシュをオン/オフにして、ユーザーインターフェイスからキャッシュの内容をクリアすることもできます。

この機能は、JMX Beanからも利用できます。

3
Taylor Gautier

@Dinoの答えはほとんどうまくいきましたが、sessionFactory.getCurrentSession()からエラーが発生しました(currentSessionContextが構成されていません!)。私はこれが私のために働いたことを発見しました:

    // Use @Autowired EntityManager em
    em.getEntityManagerFactory().getCache().evictAll();

    // All of the following require org.hibernate imports
    Session session = em.unwrap(Session.class);

    if (session != null) {
        session.clear(); // internal cache clear
    }

    SessionFactory sessionFactory = em.getEntityManagerFactory().unwrap(SessionFactory.class);

    Cache cache = sessionFactory.getCache();

    if (cache != null) {
        cache.evictAllRegions(); // Evict data from all query regions.
    }
1
KC Baltz

2次キャッシュをクリアしたい場合は、apiを使用してくださいsessionFactory.evictEntity(entityName)

コード:

/**
 * Evicts all second level cache hibernate entites. This is generally only
 * needed when an external application modifies the database.
 */
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);
    }
}

2次キャッシュの詳細については 参照

0
atish shimpi