2010-11-22 2 views
2

NHibernate를 처음 사용하고 현재 웹 사이트에 설치하는 데 어려움이 있습니다. 이 웹 사이트는 여러 웹 서버에서 하나의 데이터베이스 서버로 실행되므로 일부 동시성 문제가 발생합니다. 웹 사이트는 약 50,000 명의 사용자가 등록되어 있으며 각 사용자에게는 프로필 페이지가 있습니다. 이 페이지에서 다른 사용자는 Facebook과 마찬가지로 다른 사용자를 '좋아할'수 있습니다. 동시성 문제가 발생했습니다.NHibernate - 동시성과 2 차 레벨 캐싱을 가진 카운터

두 번째 수준의 캐시를 사용하려고합니다. 여러 웹 서버를 사용할 것이므로 MemChached 공급자를 사용하는 것이 좋습니다. 무슨 NHibernate를 사용하여 같은 '같은'기능을 구현하는 가장 좋은 방법은 무엇입니까? 세 가지 옵션을 고려했습니다 :

  1. 간단한 Count() 쿼리를 사용하십시오. 'User_Likes'테이블이있을 것입니다. 각 행은 한 사용자에서 다른 사용자로 비슷합니다. 좋아요 수를 표시하려면 사용자의 Likes 수를 물어보십시오.이 수는 데이터베이스로 간단한 SELECT COUNT(*) FROM USER_LIKES WHERE ID = x 또는 무엇인가로 변환됩니다. 그러나 사용자가 프로필 페이지를 방문 할 때마다 또 다른 사용자처럼 좋아요 수를 다시 계산해야하거나 2 차 수준 캐시가 될 때마다 큰 성능 저하가 따르게됩니다.
  2. 사용자 테이블에 NumberOfLikes 열을 추가로 사용하고 사용자가 다른 사용자를 좋아하거나 싫어할 때이 값을 증가/감소시킵니다. 그러나 이것은 동시성 문제를 일으킨다. 간단한 for-loop를 사용하여 두 개의 서버에서 1000 번 사용자를 선호하여 테스트했으며 결과는 총 1100 개였습니다. 현실적인 테스트 이건 아니건간에 이것은 물론 선택 사항이 아닙니다. 이제 낙천적이고 비관적 인 잠금을 해결책으로 보았습니다. (그렇습니까?)하지만 현재의 저장소 패턴은 현재로서는 이것을 사용하는 데 적합하지 않습니다. 문제를 해결하기 전에 이것이 올바른 길인지를 아는 것입니다.
  3. 2와 비슷하지만 사용자 정의 HQL을 사용하고 직접 업데이트 문을 작성하려면 UPDATE User SET NumberOfLikes = NumberOfLikes + 1 WHERE id = x 행을 따르는 것이 좋습니다. 데이터베이스에 동시성 문제가 발생하지 않습니다. 그러나 두 번째 수준 캐싱으로 인해 여러 서버에서 데이터 불일치가 발생하는지 잘 모르겠습니다.

그래서 ... 여기에 조언이 필요합니다. 다른 옵션이 있습니까? 이것은 일반적인 상황과 같은 느낌과 확실히 NHibernate는 우아한 방식으로 이것을 지원해야합니다. 나는 NHIbernate를 처음 사용하므로 명확하고 상세한 답변이 필요하고 고맙습니다 .--) 감사합니다!

답변

1

더 많은 지역에서이 문제가 발생할 것으로 생각됩니다. 3.로이 특정 문제를 해결할 수 있지만 동시성 문제가 발생할 다른 위치는 남겨 둡니다.

나는 비관적 인 잠금 기능을 구현하는 것이 좋습니다. 이렇게하는 일반적인 방법은 전체 HTTP 요청에 트랜잭션을 적용하는 것입니다. Global.asaxBeginRequest으로 세션과 트랜잭션을 시작합니다. 그런 다음 EndRequest에서 커밋합니다. Error 이벤트를 사용하면 롤백을 수행하고 세션을 폐기하는 대체 경로로 이동합니다.

이것은 NHibernate를 적용하는 꽤 받아 들여지는 방식입니다. 예를 들어 http://dotnetslackers.com/articles/aspnet/Configuring-NHibernate-with-ASP-NET.aspx을 참조하십시오.

+0

감사합니다. 나는 또 다른 질문을 물었다 : http://stackoverflow.com/questions/4253998/nhibernate-pessimistic-locking-not-working이 방법이 있는지 알아보기 전에 해결해야한다. – Razzie

+0

@Razzie - 답변을 추가했습니다. –

0

나는 으로 가고 싶습니다. 나는 이런 종류의 응용 프로그램에서 일부 페이지가 약간 오래 된 값을 잠깐 보여 주면 그렇게 중요하지 않다고 믿습니다.

IIRC, HQL 업데이트는 이 아니며은 엔티티 캐시 항목을 무효화하므로 수동으로해야 할 수 있습니다.

관련 문제