2015-11-12 62 views
10

Dự án của chúng tôi sử dụng Entity Framework và có 2 loại bộ nhớ cache (trong bộ nhớ, Redis) mà không có bất kỳ nhà cung cấp bộ nhớ cache nào. Do lack of second-level cache support in EF, chúng tôi đã tự thực hiện. Vì vậy, bộ nhớ cache trong bộ nhớ của chúng tôi là tập hợp các cặp khóa giá trị đơn giản trong đó khóa là Id của bộ nhớ cache và giá trị là đối tượng được lưu trong bộ nhớ cache. Chúng tôi cũng đã triển khai bộ nhớ đệm tương tự để sử dụng Redis. Đối với truy vấn chúng ta nhìn vào danh sách bộ nhớ đệm trong bộ nhớ và nếu nó không phải là chúng ta nhìn vào redis và nếu nó không có chúng tôi truy vấn đối với cơ sở dữ liệu.Bộ nhớ cache cấp ba cho NHibernate

Vì thực thể khung thực thể có tham chiếu đến ngữ cảnh, chúng tôi không thể sử dụng thực thể của DbContext trong bộ nhớ đệm và chúng tôi cần ánh xạ nó. Vì vậy, chúng tôi cần tạo nhiều DTO.

Tôi biết rằng bộ nhớ cache là cross-cutting concern vì vậy tôi tìm giải pháp sạch hơn. Vì lý do này, đầu tiên tôi quyết định sử dụng Memcached cho In-Memory (thay vì sử dụng danh sách đơn giản). Thứ hai và quan trọng nhất là tôi có thể di chuyển từ EF sang NHibernate để hỗ trợ Second-Cache. Tôi biết rằng first level cache is occupied by session object. Vì vậy, tôi muốn sử dụng Memcached cho bộ nhớ cache cấp thứ hai. Nhưng có bất kỳ bộ nhớ cache cấp thứ ba nào cho Redis không?

+0

Giới thiệu về DTO, bạn có gặp sự cố khi sử dụng các thực thể có proxy (của DbContext) không? Thông thường, các vấn đề phát sinh khi bạn cố gắng truy cập vào các thuộc tính liên quan không được tải vì trình tải lười không thể truy cập vào bối cảnh đã xử lý nhưng bạn có cùng vấn đề với các thực thể tách rời (trong cả hai trường hợp bạn cần sử dụng Bao gồm). Một lần nữa về DTO tôi thực hiện luôn Clone bắt đầu thực hiện một bản sao nông (nhưng nó phụ thuộc vào thực thể) và thường (luôn luôn) một trường giá trị sao chép (sử dụng một chức năng tùy chỉnh tương tự như MemberwiseClone nhưng không MemberwiseClone nếu không bạn có một lần nữa toàn bộ proxy). – bubi

+0

@bubi Tôi không muốn thỏa hiệp mô hình miền của mình cho khuôn khổ kiên trì. Tạo DTO là một cái gì đó giống như Momento Pattern. Thứ hai, tôi muốn một nhà cung cấp bộ nhớ cache tốt mà khung thực thể has'nt. –

+0

Bạn không thỏa hiệp mô hình bằng cách sử dụng phương pháp trên. Tôi nghĩ rằng bạn đã làm nhưng nếu bạn không bạn có thể có một cái nhìn để triển khai bộ nhớ cache cấp 2 cho EF. Về Hibernate tôi đề nghị bạn nên thử nếu cho mục đích của bạn hoạt động tốt. Tôi có thể nói rằng bây giờ (đối với các dự án mới) Tôi đang sử dụng EF trong khi các dự án cũ vẫn còn trong Hibernate. Vấn đề về Hibernate là thường bạn cần phải thực hiện các truy vấn rất sớm. Nếu bạn nghĩ rằng để làm việc trong bộ nhớ thường xuyên/luôn luôn nó hoạt động tốt nhưng nếu bạn cần phải làm việc trên DB bạn đôi khi cần phải viết HQL hoặc SQL (hoặc để chèn ToList() sớm trong truy vấn). – bubi

Trả lời

2

Một cách để triển khai bộ nhớ cache cấp thứ hai mà không cần tạo nhiều DTO là sử dụng danh sách giá trị tên thuộc tính trong danh sách giá trị khóa thay vì lưu trữ DTO. Theo sự hiểu biết của tôi không có bộ nhớ cache cấp thứ ba trong NHibernate. Một cách để làm điều này là thực hiện một nhà cung cấp bộ nhớ cache tùy chỉnh mà trước tiên có thể tìm trong Redis và nếu nó không thể tìm thấy nó sau đó nhận được các giá trị từ Memcached.

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