質問

マルチテナンシーをサポートするために、同じインスタンス内で複数のデータベースをサポートする必要があるという要件が与えられました。各 DB には同一のスキーマがあります。ユーザーはリストから選択して特定のデータベースにログインし、その後のすべての呼び出しはログアウトするまでその DB に送られます。

クライアントから提供されたパラメータに基づいて、単一の HibernateDaoTemplate 内のセッション ファクトリをホット スワップしたいと考えています。

データ ソースのホットスワップ (およびそれに関連するすべてのトランザクションの問題) に関する情報はたくさんありますが、セッション ファクトリをホット スワップし、それぞれのすべてのキャッシュを保持したいと考えています。

これを行う最も簡単な方法は何ですか?DaoTemplate の HotSwappableTarget を構成しますか?誰かがこれを行う方法のサンプルを教えてくれますか?

役に立ちましたか?

解決

すべてのデータベースが同一である場合は、単一の SessionFactory を使用し、実際に「テナント対応」の DataSource と Cache に独自の実装を提供することをお勧めします。(これらの実装は非常に簡単です:テナント ID -> 実キャッシュ/実データソースのマップを維持し、すべての呼び出しを適切なものに委任するだけです)。テナント対応のキャッシュとデータソースを使用するように単一の SessionFactory を構成します。ThreadLocal を使用すると、現在のリクエストのテナント ID を、それを知る必要があるコードで利用できるようにすることができます。

私は以前、このアプローチを使用してマルチテナントをサポートすることに成功しました。

他のヒント

私が以前働いていた場所では、次の ThreadLocal 経由でこれを行っていました このガイド。 ここでは 1 つの SessionFactory を使用し、ユーザーがログイン中に変更できるセッション変数に基づいてそのデータソースを交換しました。正確な詳細は覚えていませんが、ご興味があれば、実装に関する詳細情報を調べることができます。

そうは言っても、私の以前の職場の人たちは現在、このアプローチから離れ、シャード データベースに移行しています。間違いなくよりエレガントなソリューションなので、ぜひ検討してみてください。

HibernateDaoSupport から DAO クラスを拡張し、setSessionFactory() メソッドを呼び出してデータベースのホット スワップを実行します。

Hibernate Shards プロジェクトもご覧ください。

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

...これは、Hibernate Core に水平パーティショニングのサポートを追加することに重点を置いています。Hibernate API はまだ完全にはカバーされていませんが、その大部分はサポートされています (ニーズには十分でない場合もあります)。もちろん、彼らは完全なカバーに向けて取り組んでいます。

ThreadLocal 経由でキャッシュ プロバイダーも試してみましたが、難しい部分はキャッシュ上でホット スワップを実行することでした。SessionFactory にアクティブなセッションが関連付けられていないことを確認する必要があります。さて、もっと良い解決策があると思います。Spring 3 Java 構成を使用すると、テナント対応の SessionFactory を動的に作成し、Spring にキャッシュ管理を行わせることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top