2011-02-08 2 views
4

ORM을 사용하기 전에 우리는 항상 서비스 계층에서 객체 캐싱을 수행했습니다. 이로 인해 캐싱 구현을 변경하지 않고도 서로 다른 데이터 레이어간에 전환 할 수있었습니다.엔티티 프레임 워크와 NHibernate - 여전히 서비스 계층 책임을 캐시하고 있습니까?

요즘 우리는 Entity Framework (주로 코드 우선)와 NHibernate를 모두 사용합니다. NHibernate는 이용 가능한 몇몇 2 차 레벨 캐시 제공자들과 함께 훨씬 더 나은 캐싱 기능들을 가진 것으로 보인다.

내가 직면 한 또 다른 문제는 위의 두 ORM 모두에서 지연로드 속성을 사용한다는 것입니다. 따라서 캐시에서 객체를 가져 오는 경우 일반적으로 현재 ObjectContext/ISession에 다시 첨부해야합니다. 서비스 계층에서는 실제로 할 수 없습니다.

그럼 실제로 리포지토리/데이터 레이어에서 캐싱을 구현해야합니다. EF와 NH의 공통적 인 해결책을 찾을 수 있을까요?

감사 벤

답변

4

CQRS pattern을 보았습니까? caching is policy이기 때문에 두 번째 계층 캐시와 같이 "모든 크기에 맞는"캐시로 이러한 결정을 자동화하려고합니다. 예를 들어, 정말로 캐시하려는 내용이 사이트 홈 페이지의 HTML이면 두 번째 계층 캐시는 메모리 낭비와 버그에 대한 초대 일뿐입니다.

CQRS는 이러한 기계적 고려 사항을 정책 결정으로 바꿉니다. 그리고 그것은 ORM과 무관합니다.

+0

안녕하세요 크레이그, 링크 해 주셔서 감사합니다. Udi의 비디오 덕분에이 문제를 해결할 수있었습니다 (http://bit.ly/d29jZU). CQRS는 웹/전자 상거래 응용 프로그램에 적합합니다. 특히 "부실한"(제품 정보), 개인화 된 (카트, 프로필) 및 라이브 (가능한 한 많이 살 수있는 주식 레벨) 데이터. Udi는 문제가 발생하면 명령을 전달하고 비동기 응답을 발행하는 방법에 대해서도 이야기합니다. 일반적으로 웹 응용 프로그램에서 구현하기 쉽지 않은 문제입니다. –

+0

음, amazon.com은 이러한 것들 ("결국 일관성")을 개척했기 때문에 그렇습니다. 전자 상거래에서는 괜찮습니다. 분명히, 당신은 오래 될 수있는 것과 그렇지 못할 수있는 것을 선택해야합니다. 하지만 요점은 기술적 고려 사항이 아니라 사업이라는 점입니다. –

+0

기존 응용 프로그램에 추가 할 수있는 것이거나 코드 작성을 시작하기 전에 실제로 그러한 아키텍처상의 결정을 내려야합니까? 분명히 중요한 의미없이 언제든지 http 캐싱과 같은 기능을 추가 할 수 있습니다. –

2

내 경험은 ORM에서 제공하는 2 레벨 캐시 데이터베이스에서 검색 한 실제 결과 집합을 기준으로 데이터를 캐시하는 것입니다. 개체 인스턴스화 및 데이터 채우기가 꽤 비싸기 때문에 이렇게 많은 오버 헤드가 발생할 수 있습니다.

이점은 지연로드 등이 잘 작동하지만 큰 결과는 개체를 다시 채울 때 많은 리소스를 사용합니다.

우리는 웹 응용 프로그램에서 2 차 수준 캐시와 ASP.NET 캐시를 조합하여 사용합니다. 비용이 많이 드는 오버 헤드로 인해 드물게 몇 초 (!)를 절약 할 수 있지만 단점이 있습니다. 게으른로드 콜렉션 또는 엔터티를 업데이트하십시오.

이것은 NHibernate만을 기반으로 합니다만, 엔티티 프레임 워크를 사용 해본 적이 없지만 모든 ORM 프레임 워크가이 문제로 고통 받고 있다고 생각합니다.

관련 문제