2014-12-17 20 views
6

Chúng tôi sử dụng NHibernate 4 trong ứng dụng asp.net mvc 4 (.net 4) của chúng tôi. Theo như tôi có thể nói với hành vi của NHibernate 4 đã thay đổi một chút khi nói đến bộ nhớ đệm cấp độ thứ hai.NHibernate 4: Sử dụng bộ nhớ cache cấp thứ hai cho bộ sưu tập trẻ em tải chậm

Các hành vi sau đây dường như đã thay đổi (hãy sửa lại cho tôi nếu tôi sai):

  • Có không còn là một giao dịch cần thiết khi sử dụng mức độ thứ hai bộ nhớ cache
  • Khi tôi thực hiện một truy vấn như (Hibsession Ở đây (x => x.Name == "x"). ToList()), sau đó nó sẽ truy vấn cho thực thể toàn bộ. Trong các phiên bản trước của NHibernate - nếu tôi nhớ chính xác - chỉ có id của thực thể sẽ được truy lục.

Dường như với tôi rằng mức độ thứ hai chỉ áp dụng trong các trường hợp sau đây:

using (var hibSession = SessionFactory.OpenSession()) 
{ 
    // Second level cache working 
    var entity = hibSession.Get<ChachedEntity>(7); // second level cache working 
    var parent = entity.ParentElement; // second level cache working because n:1 

    // Probably working (not tested) 
    var elements = hibSession.Query<ChachedEntity>().Cacheable().Take(30).ToList(); // guessed behaviour: query-cache selects id's and then then uses second level cache 

    // second level cache NOT Working 
    var children = entity.ChildCollectionWithCachableEntities; // second level cache NOT working because 1:n (!!) 
} 

câu hỏi của tôi bây giờ là:

  • đâu là hành vi của NHibernate 4 tầng hai bộ nhớ cache được mô tả (hoặc ít nhất là thay đổi đối với phiên bản 3 được ghi lại)
  • Có thể sử dụng bộ nhớ cache cấp thứ hai cho các phần tử con tải chậm không? (Hoặc ít nhất là đảm bảo rằng chỉ có id được nạp và sau đó có bộ nhớ cache mức thứ hai hiện thực các thực thể)

Cảm ơn trước

Trả lời

0

giao dịch vẫn là cần thiết. Việc không sử dụng chúng sẽ vô hiệu hóa bộ nhớ cache ngay sau khi bạn bắt đầu cập nhật một số thực thể được lưu trong bộ nhớ cache. (See here as for why, tôi bị cắn gần đây với phiên bản NH mới nhất. Tại sao tôi lại bỏ qua giao dịch? Không có lý do gì ... Có hơn read committed snapshot được bật trong SQL Server giúp loại bỏ deadlocks liên quan đến truy vấn chỉ đọc được đọc.)

Bộ nhớ đệm hoạt động , nhưng phải được cấu hình trong ánh xạ bộ sưu tập. Thêm một nút <cache usage="..." /> vào bộ của bạn và các bộ sưu tập khác cần được lưu vào bộ nhớ cache. Các thực thể chứa của chúng cũng phải được lưu vào bộ nhớ cache để thực sự hữu ích. (Bộ nhớ đệm chỉ lưu trữ các khóa chính có liên quan.)

Trên cơ chế truy vấn chỉ tải id từ DB nếu truy vấn có thể lưu vào bộ nhớ cache, tôi chưa bao giờ chứng kiến ​​điều đó, mặc dù tôi là người dùng NHibernate. (Tôi đang sử dụng nó kể từ phiên bản 0.9 của nó, nó đã rất trưởng thành và giàu tính năng.) Theo như tôi biết, không có bất kỳ thay đổi nghiêm trọng trong bộ nhớ cache cấp thứ hai với NH 4. Bạn có thể kiểm tra issues and changes tracker của họ.

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