2013-03-18 6 views
5

NHibernate와 여러 데이터베이스 (동적 연결)에 대한 StackOverflow의 몇 가지 질문은 SessionFactory (데이터베이스 당) 캐시와 캐시를 유지하는 것이 최선이라고 생각합니다. 구성으로, SessionFactory를 더 빠르게 빌드 할 수 있습니다.NHibernate를 사용하는 다중 데이터베이스를위한 SessionFactory와 설정

이 접근 방식이 올바른지 알고 싶습니다. : 주로 인스턴스와 시간당 메모리 소비 측면에서 SessionFactory의 "가중치"는 무엇입니까?

MY 접근 방식에 대해 자세히 1, 2 레벨 캐시는 SessionFactory에 "영역"에 살고 있다고 알려진

, 우리는 메모리 사용량이 포함 (연 ISession의 양에 관련이있을 수 있다고 가정 할 수 1 차 캐시 레벨).

제 2의 캐시 레벨의 경우 데이터베이스가 동일한 스키마를 공유하고 일부 COMMON 읽기 전용 테이블이있는 경우 모든 세션 팩터에서 읽기 전용 테이블 만 공유하는 글로벌 캐시 구현을 사용할 수 있습니다.

맞습니까?이 방법으로 어떤 종류의 성능 및 메모리 문제가 발생할 수 있습니까? 수 백 또는 수천 개의 데이터베이스에 액세스하는 웹 응용 프로그램 (ASP.NET MVC, Webforms가 아닌)을 고려하여 각 HTTP REQUEST에서 사용자 데이터베이스를 찾고 액세스 권한을 지정해야합니다 (ISession 가져 오기, 사용 및 폐기).

연결 풀 : 연결 풀은 어떻게됩니까? 그러한 접근 방식과 같이 수백 또는 수천 개의 데이터베이스 풀을 관리해야하는 행동에는 어떤 종류가 있습니까? NHibernate와 함께 사용되는 현재 구현 중 일부는 도움이 될 수도 있고 내 자신을 생성해야 할 수도 있습니까?

+1

우리는 대략 20-30 세션 팩토리의 다중 설치 프로그램에서 NHibernate를 사용했는데 정확한 숫자는 기억하지 못합니다. 그러나 추가 된 각 테넌트에 대해 메모리 소비가 눈에 띄게 높아졌습니다. 커스텀'IConnectionProvider'를 사용하여 가난한 사람의 멀티 테넌시 지원을 구현할 수 있지만이 경우에는 2 차 캐시를 사용할 수 없습니다.멀티 테넌시 기능은 원래의 Hibernate (다중 db 커넥션 당 하나의 세션 팩토리)에 의해 지원되며, github에서이 기능의 일부를 구현하는 Hibernate에 대한 pull 요청이있다 - https://github.com/nhibernate/nhibernate-core/pull/91. – Vasea

답변

2

일부 테스트 결과에 따르면 Configuration 및 SessionFactory를 구성하는 데 소요되는 시간과 리소스 (CPU 및 메모리)에 대해 언급했지만 일부 부스는 비싸지 만 SessionFactory는 훨씬 비싸다. 그러나 우리는 불행히도 내 수업 모델에 따라 달라지는 테스트와 마찬가지로 개인 테스트, 경험적 결과 만 있습니다.

그래서 저는 SessionFactory와 Configuration을 캐시해야한다고 믿습니다.하지만 웹 솔루션에 수백 개의 데이터베이스가 있다면 우리는 큰 문제가 있습니다. 왜냐하면 SessionFactory는 메모리에 굶주려 있기 때문에 "메모리 먹는 사람"입니다. 400 인스턴스 근처에서 OutOfMemoryException을 얻었고 수천 개의 데이터베이스에 도달 할 것으로 예상됩니다.

우리는 SQLServer를 사용할 때 각 데이터베이스에 하나씩 SessionFactory를 하나씩 갖도록 캐시를 설계 했으므로 ConnectionProvider에서 각 연결이 올바르게 작동 할 수 있도록 준비하는 SQL 명령 USE 'catalog-name'을 삽입 할 수 있습니다 요청 당 각각의 데이터베이스가 있습니다.

일부 데이터베이스는 데이터베이스 (카탈로그 이름)가 아닌 스키마 이름을 통해 그렇게 할 수 있지만 같은 문제가있는 다른 사용자도 SQLServer의 리소스를 탐색 할 수 있기를 바랍니다.

행운을 비네.

+0

ISession.OpenSession에 IDbConnection을 제공하는 것이 더 간단하지 않습니까?'var conn = myApp.GetOpenConnection(); var session = sessions.OpenSession (conn); –

+0

아니요. 컨텍스트 (예 : 캐시)가 연결 범위에 있지 않으므로 "컨텍스트"(세션)를 따라 연결을 변경할 수 있습니다. 다른 데이터베이스 (연결),하지만 캐시 된 데이터/세션은 어떻습니까? – Luciano