문제

다중 테넌시를 지원하기 위해 동일한 인스턴스에서 여러 데이터베이스를 지원 해야하는 요구 사항이 부여되었습니다. 각 DB에는 동일한 스키마가 있습니다. 사용자는 목록에서 선택하여 특정 데이터베이스에 로그인하며 모든 후속 통화는 로그 아웃 할 때까지 해당 DB로 이동합니다.

클라이언트가 제공 한 매개 변수를 기반으로 단일 최대 절전 모드 내부의 세션 공장을 핫 스왑하고 싶습니다.

핫 스왑 데이터 소스 (및 이와 관련된 모든 트랜잭션 문제)에서 많은 것들을 찾을 수 있지만 세션 공장을 스왑하고 싶습니다. 각각의 캐싱을 모두 유지하고 싶습니다.

이것을하는 가장 쉬운 방법은 무엇입니까? daotemplate에 대한 핫 스웨이 블리 타겟을 구성 하시겠습니까? 누구 든지이 작업을 수행하는 방법에 대한 샘플을 지적 할 수 있습니까?

도움이 되었습니까?

해결책

모든 데이터베이스가 동일하면 단일 세션 기능을 사용하고 실제로 "임차인 인식"인 데이터 소스 및 캐시에 대한 자체 구현을 제공하는 것이 좋습니다. (이를 구현하는 것은 상당히 사소합니다. 테넌트 ID -> 실제 캐시/실제 데이터 소스의지도를 유지 한 다음 모든 호출을 적절한 항목으로 위임하십시오). 임차인 인식 캐시 및 데이터 소스를 사용하도록 단일 세션 별을 구성하십시오. ThreadLocal을 사용하여 현재 요청의 임차인 ID를 알아야 할 코드에 사용할 수 있습니다.

다중 테넌시를 지원하기 위해 성공하기 전에이 접근법을 사용했습니다.

다른 팁

내가 일했던 곳에서 우리는 ThreadLocal follow를 통해 이것을했습니다. 이 안내서. 우리는 방금 하나의 SessionFactory를 사용하고 로그인 한 상태에서 사용자가 변경할 수있는 세션 변수를 기반으로 데이터 소스를 교체했습니다. 정확한 세부 사항을 기억하지 못하지만 관심이 있으시면 구현에 대한 자세한 정보를 파헤칠 수 있습니다.

그럼에도 불구하고, 나의 이전 직장에있는 사람들은 이제이 접근법에서 벗어나 샤드 데이터베이스로 이동하고 있습니다. 확실히 더 우아한 솔루션을 살펴보십시오.

DAO 클래스를 HibernatedaOsupport에서 연장 한 다음 SetSessionFactory () 메소드를 호출하여 데이터베이스의 핫 스왑을 수행하십시오.

Hibernate Shards 프로젝트를 살펴볼 수도 있습니다.

http://www.hibernate.org/414.html

... 수평 파티셔닝에 대한 지원을 추가하는 데 중점을 둡니다. 아직 전체 최대 절전 모드 API를 다루지는 않지만 많은 부분을 지원합니다 (필요에 충분하거나 충분하지 않을 수도 있음). 물론, 그들은 완전한 보도를 위해 노력하고 있습니다.

또한 ThreadLocal을 통해 캐시 제공 업체를 시도했는데 어려운 부분은 캐시에서 핫 스왑을 수행하는 것이 었습니다. SessionFactory에 활성 세션이 연결되어 있지 않도록해야합니다. 이제 훨씬 더 나은 솔루션이 있다고 생각합니다. Spring 3 Java 구성을 사용하면 임차인 인식 세션 기능을 동적으로 만들고 Spring이 캐시 관리를 수행하도록 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top