2015-11-12 71 views
10

Nasz projekt wykorzystuje Entity Framework i ma 2 rodzaje pamięci podręcznej (in-memory, Redis) bez jakiegokolwiek dostawcy pamięci podręcznej. Z uwagi na lack of second-level cache support in EF wdrożyliśmy go samodzielnie. Tak więc nasza pamięć podręczna w pamięci jest prostym zbiorem pary klucz-wartość, gdzie klucz to Id pamięci podręcznej, a wartością jest buforowany obiekt. Zaimplementowaliśmy również podobne buforowanie, aby korzystać z Redis. Dla zapytania sprawdzamy listę pamięci podręcznej w pamięci, a jeśli nie, sprawdzamy redis, a jeśli nie, szukamy bazy danych.Pamięć podręczna trzeciego poziomu dla NHibernate

Ponieważ encje szkieletowe odwołują się do kontekstu, nie możemy używać encji o wartości DbContext w pamięci podręcznej i musimy ją zamapować. Dlatego potrzebujemy stworzyć wiele DTO.

Wiem, że pamięć podręczna to cross-cutting concern, więc szukam czystszego rozwiązania. Z tego powodu najpierw zdecydowałem się użyć Memcached dla In-Memory (zamiast używania prostej listy). Jako drugi i co najważniejsze mogę migrować z EF do NHibernate, aby uzyskać wsparcie dla drugiej pamięci podręcznej. Wiem, że first level cache is occupied by session object. Dlatego chcę użyć Memcached dla pamięci podręcznej drugiego poziomu. Ale czy istnieje jakaś pamięć podręczna trzeciego poziomu dla Redis?

+0

O DTO masz problemy z korzystaniem z podmiotów z proxy (DbContext)? Zwykle problemy pojawiają się, gdy próbujesz uzyskać dostęp do powiązanych właściwości, które nie zostały załadowane z powodu leniwego programu ładującego, który nie może uzyskać dostępu do usuniętego kontekstu, ale masz podobny problem z odłączonymi jednostkami (w obu przypadkach musisz użyć Uwzględnij). Znowu o DTO zaimplementuję zawsze Klon zaczynający wdrażanie płytkiego klonu (ale to zależy od encji) i często (zawsze) kopiuje wartości pól (używając niestandardowej funkcji podobnej do MemberwiseClone, ale nie MemberwiseClone w przeciwnym razie znowu masz cały proxy). – bubi

+0

@bubi Nie chcę kompromisu w moim modelu domeny dla szkieletu trwałości. Tworzenie DTO to coś w stylu Momento Pattern. Po drugie chcę mieć dobrego dostawcę pamięci podręcznej, który nie ma struktury encji. –

+0

Nie podważasz modelu za pomocą powyższego podejścia. Myślę, że tak, ale jeśli nie, możesz rzucić okiem na implementacje pamięci podręcznej drugiego poziomu dla EF. O Hibernate Proponuję ci spróbować, jeśli dla twojego celu działa dobrze. Mogę powiedzieć, że teraz (dla nowych projektów) używam EF, podczas gdy stare projekty są nadal w Hibernate. Problem z Hibernate polega na tym, że często trzeba zmaterializować zapytania bardzo wcześnie. Jeśli myślisz, że działasz w pamięci często/zawsze działa dobrze, ale jeśli potrzebujesz pracować na DB, czasami musisz napisać HQL lub SQL (lub wstawić ToList() na początku zapytania). – bubi

Odpowiedz

2

Jednym ze sposobów wdrożenia pamięci podręcznej drugiego poziomu bez tworzenia wielu DTO jest użycie listy wartości właściwości na liście wartości klucza zamiast zapisywania DTO. Zgodnie z moim rozumieniem nie ma pamięci podręcznej trzeciego poziomu w NHibernate. Jednym ze sposobów na wykonanie tego jest zaimplementowanie niestandardowego dostawcy pamięci podręcznej, który może najpierw zajrzeć do Redis, a jeśli nie może go znaleźć, to uzyskać wartości z Memcached.

Powiązane problemy