2次キャッシュとクエリキャッシュを使用しています。プログラムですべてのキャッシュをクリアする方法を教えてもらえますか?
7 に答える
Bozhoの回答に示されているコードスニペットは、Hibernate4では非推奨になっています。
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でHibernateキャッシュインターフェイス(Hibernate 4.3)を確認することをお勧めします。
また、休止状態の開発ガイド(4.3)からの第2レベルのキャッシュ排除。
セッションキャッシュをクリアするには、session.clear()
第2レベルのキャッシュをクリアするには、このコードスニペットを使用します
Terracottaを接続すると、Terracotta Dev Consoleを実行して、キャッシュに関する統計を調べたり、キャッシュのオンとオフを切り替えたり、ユーザーインターフェイスからキャッシュの内容をクリアしたりすることもできます。
この機能は、JMXBeanからも利用できます。
@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.
}
第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レベルのキャッシュの詳細については、以下を参照してください。
@Dinoの回答と同じで、JPA2.0APIの構文を短縮しました。
@Autowired
private EntityManagerFactory entityManagerFactory;
public void clearHibernateCaches() {
entityManagerFactory.getCache().unwrap(org.hibernate.Cache.class).evictAllRegions();
}
あなたもこれで行くことができます
request.getSession().invalidate();
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);