2010-03-17 50 views

Trả lời

16

Để xóa bộ nhớ cache phiên sử dụng session.clear()

Để xóa cấp 2 sử dụng bộ nhớ cache this code snippet

+5

Đối với các phiên bản hiện đại của Hibernate, sẽ tốt hơn nếu theo dõi @ dino's câu trả lời. – JorgeHortelano

3

Nếu bạn cắm vào đất nung, bạn cũng có khả năng chạy các Terracotta Dev Console có thể kiểm tra thống kê về cache, bật và tắt bộ nhớ cache và xóa nội dung bộ nhớ cache khỏi giao diện người dùng.

Chức năng này cũng có sẵn từ hạt JMX.

28

Đoạn mã đã nêu trong Bozho câu trả lời là bị phản đối trong Hibernate 4.

Theo Hibernate javadoc, bạn có thể sử dụng org.hibernate.Cache.evictAllRegions():

đuổi dữ liệu từ tất cả các vùng truy vấn.

Sử dụng 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. 
} 

Ngoài ra, bạn có thể xóa tất cả dữ liệu từ một phạm vi cụ thể:

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

Bạn có thể muốn kiểm tra the JavaDoc for hibernate Cache interface (Hibernate 4.3).

Và cũng có thể, second-level cache eviction từ hướng dẫn phát triển ngủ đông (4.3).

+0

Tôi muốn xóa dữ liệu bộ nhớ cache khỏi bộ nhớ cache cấp 2 bằng cách gọi phương thức bên dưới: - sessionFactory.getCache(). EvictEntityRegions(); Tôi chỉ muốn biết, có bất kỳ tác hại nào trong việc này không? Ví dụ: - Điều gì sẽ xảy ra nếu tôi cố xóa bộ nhớ cache ở giữa giao dịch? –

+1

Tôi đoán nó phụ thuộc vào chiến lược và nhà cung cấp bộ nhớ đệm của bạn. Bạn có thể cần phải kiểm tra nó với một trong những lựa chọn. Tài liệu tham chiếu mô tả các cài đặt khác nhau. – Dino

+0

Tôi đang sử dụng @Cache (usage = CacheConcurrencyStrategy.READ_WRITE). Tôi có một case.Suppose nếu một số giao dịch đang chạy để có được dữ liệu từ và bộ nhớ cache cấp 2 có dữ liệu tại thời điểm đó. Đồng thời, một luồng khác gợi lên tất cả các vùng lưu trữ trong khi giao dịch trước đó chưa hoàn tất. Sau đó, những gì sẽ xảy ra trong trường hợp này. Tôi có thể nhận được null từ bộ nhớ cache trong giao dịch đó và nhấn db sẽ xảy ra không? Có bất kỳ cơ hội nào của bất kỳ vấn đề nào không? –

-7

bạn có thể đi với điều này cũng

request.getSession().invalidate();  
     response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
     response.setHeader("Pragma", "no-cache"); 
     response.setDateHeader("Expires", 0); 
+6

HttpSession và hibernate session là những thứ khác nhau. –

0

Nếu bạn muốn xóa bộ nhớ cache cấp 2, sử dụng api sessionFactory.evictEntity(entityName)

Code:

/** 
* 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); 
    } 
} 

Để biết thêm chi tiết về cấp 2 bộ nhớ cache refer

Các vấn đề liên quan