NHibernate를 처음 사용하고 현재 웹 사이트에 설치하는 데 어려움이 있습니다. 이 웹 사이트는 여러 웹 서버에서 하나의 데이터베이스 서버로 실행되므로 일부 동시성 문제가 발생합니다. 웹 사이트는 약 50,000 명의 사용자가 등록되어 있으며 각 사용자에게는 프로필 페이지가 있습니다. 이 페이지에서 다른 사용자는 Facebook과 마찬가지로 다른 사용자를 '좋아할'수 있습니다. 동시성 문제가 발생했습니다.NHibernate - 동시성과 2 차 레벨 캐싱을 가진 카운터
두 번째 수준의 캐시를 사용하려고합니다. 여러 웹 서버를 사용할 것이므로 MemChached 공급자를 사용하는 것이 좋습니다. 무슨 NHibernate를 사용하여 같은 '같은'기능을 구현하는 가장 좋은 방법은 무엇입니까? 세 가지 옵션을 고려했습니다 :
- 간단한 Count() 쿼리를 사용하십시오. 'User_Likes'테이블이있을 것입니다. 각 행은 한 사용자에서 다른 사용자로 비슷합니다. 좋아요 수를 표시하려면 사용자의 Likes 수를 물어보십시오.이 수는 데이터베이스로 간단한
SELECT COUNT(*) FROM USER_LIKES WHERE ID = x
또는 무엇인가로 변환됩니다. 그러나 사용자가 프로필 페이지를 방문 할 때마다 또 다른 사용자처럼 좋아요 수를 다시 계산해야하거나 2 차 수준 캐시가 될 때마다 큰 성능 저하가 따르게됩니다. - 사용자 테이블에
NumberOfLikes
열을 추가로 사용하고 사용자가 다른 사용자를 좋아하거나 싫어할 때이 값을 증가/감소시킵니다. 그러나 이것은 동시성 문제를 일으킨다. 간단한 for-loop를 사용하여 두 개의 서버에서 1000 번 사용자를 선호하여 테스트했으며 결과는 총 1100 개였습니다. 현실적인 테스트 이건 아니건간에 이것은 물론 선택 사항이 아닙니다. 이제 낙천적이고 비관적 인 잠금을 해결책으로 보았습니다. (그렇습니까?)하지만 현재의 저장소 패턴은 현재로서는 이것을 사용하는 데 적합하지 않습니다. 문제를 해결하기 전에 이것이 올바른 길인지를 아는 것입니다. - 2와 비슷하지만 사용자 정의 HQL을 사용하고 직접 업데이트 문을 작성하려면
UPDATE User SET NumberOfLikes = NumberOfLikes + 1 WHERE id = x
행을 따르는 것이 좋습니다. 데이터베이스에 동시성 문제가 발생하지 않습니다. 그러나 두 번째 수준 캐싱으로 인해 여러 서버에서 데이터 불일치가 발생하는지 잘 모르겠습니다.
그래서 ... 여기에 조언이 필요합니다. 다른 옵션이 있습니까? 이것은 일반적인 상황과 같은 느낌과 확실히 NHibernate는 우아한 방식으로 이것을 지원해야합니다. 나는 NHIbernate를 처음 사용하므로 명확하고 상세한 답변이 필요하고 고맙습니다 .--) 감사합니다!
감사합니다. 나는 또 다른 질문을 물었다 : http://stackoverflow.com/questions/4253998/nhibernate-pessimistic-locking-not-working이 방법이 있는지 알아보기 전에 해결해야한다. – Razzie
@Razzie - 답변을 추가했습니다. –