2012-02-24 21 views
5

Chúng tôi có một số vùng bộ nhớ cache được thiết lập trong triển khai nHibernate của chúng tôi. Để tránh sự cố với máy chủ web cân bằng tải, tôi muốn vô hiệu hóa hiệu quả bộ nhớ đệm trên các trang chỉnh sửa dữ liệu được lưu trong bộ nhớ cache. Tôi có thể viết một phương thức xóa tất cả bộ nhớ truy vấn của tôi, bộ nhớ cache của lớp và thực thể của tôi lưu trữ dễ dàng đủ.Bộ nhớ đệm cấp hai ở chế độ NHibernate - xóa các vùng

Nhưng điều tôi thực sự muốn là xóa bộ nhớ cache theo vùng. sessionFactory.EvictQueries() sẽ lấy một tham số vùng, nhưng Evict() và EvictCollection() thì không. Tôi không thực sự muốn vứt bỏ toàn bộ bộ nhớ cache ở đây, cũng như tôi không muốn duy trì một số từ điển vụng về liên kết các loại với vùng bộ nhớ cache của chúng. Có nHibernate có một cách để yêu cầu một thực thể hoặc bộ sưu tập các thiết lập bộ nhớ đệm của nó là gì?

cảm ơn

+0

Hey @Ted, có vẻ như bạn đang cố gắng thực hiện điều gì đó theo cách thủ công mà bạn đã có thể kết nối. Có lý do nào khiến bạn không thiết lập một số loại phụ thuộc bộ nhớ cache để tự động gỡ bỏ các mục khi thay đổi được thực hiện cho kho dữ liệu không? Giống như một SqlCacheDependency? – swannee

+0

hoặc thậm chí tốt hơn - sử dụng bộ nhớ cache được phân phối? nHibernate hỗ trợ những người –

+0

Tôi rất thích sử dụng một bộ nhớ cache phân phối nhưng khách hàng không quan tâm, vì lý do khách hàng ngu ngốc. Tôi đang nhìn vào CacheDependency bây giờ, mặc dù chúng tôi đang sử dụng Oracle để thực hiện SQL Server cụ thể là không sử dụng với tôi. Có vẻ như việc triển khai thực hiện chung các công việc dbCacheDependency bằng cách bỏ phiếu và dựa vào một số công cụ OLEDB. Đó có phải là người biểu diễn không? nó có tác động gì đối với lựa chọn tài xế của tôi không? Tôi đang tìm kiếm các trình điều khiển bên thứ 3 của Oracle như DataDirect và Devart cũng như ODP.NET. – Ted

Trả lời

0

OK, có vẻ như tôi đã trả lời câu hỏi của riêng mình. Giao diện mặc định được trả lại khi bạn rút ra siêu dữ liệu nHibernate không cung cấp thông tin về bộ đệm ẩn, tuy nhiên nếu bạn tìm hiểu kỹ hơn về việc triển khai nó, nó sẽ thực hiện. Một chút vụng về, nhưng nó thực hiện công việc.

4

Tôi vừa làm điều tương tự. Đối với lợi ích của mọi người, đây là phương pháp tôi đã tạo:

public void ClearCache(string regionName) 
    { 
     // Use your favourite IOC to get to the session factory 
     var sessionFactory = ObjectFactory.GetInstance<ISessionFactory>(); 

     sessionFactory.EvictQueries(regionName); 

     foreach (var collectionMetaData in sessionFactory.GetAllCollectionMetadata().Values) 
     { 
      var collectionPersister = collectionMetaData as NHibernate.Persister.Collection.ICollectionPersister; 
      if (collectionPersister != null) 
      { 
       if ((collectionPersister.Cache != null) && (collectionPersister.Cache.RegionName == regionName)) 
       { 
        sessionFactory.EvictCollection(collectionPersister.Role); 
       } 
      } 
     } 

     foreach (var classMetaData in sessionFactory.GetAllClassMetadata().Values) 
     { 
      var entityPersister = classMetaData as NHibernate.Persister.Entity.IEntityPersister; 
      if (entityPersister != null) 
      { 
       if ((entityPersister.Cache != null) && (entityPersister.Cache.RegionName == regionName)) 
       { 
        sessionFactory.EvictEntity(entityPersister.EntityName); 
       } 
      } 
     } 
    } 
Các vấn đề liên quan