8

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

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

ホットスワップ データ ソース (およびそれに関連するすべてのトランザクションの問題) で多くのものを見つけることができますが、セッション ファクトリをホット スワップして、それぞれのすべてのキャッシュを保持したいと考えています。

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

4

5 に答える 5

2

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

そうは言っても、私の以前の職場の人たちは現在、このアプローチから離れて、シャード データベースに移行しています。間違いなく、よりエレガントなソリューションをご覧になることをお勧めします。

于 2008-09-27T21:32:49.693 に答える
2

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

マルチテナンシーをサポートするために、以前にこのアプローチを使用したことがあります。

于 2008-09-23T12:29:42.240 に答える
1

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

于 2009-07-05T13:12:39.127 に答える
0

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

于 2010-01-15T06:40:29.650 に答える
0

Hibernate Shards プロジェクトも参照できます。

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

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

于 2008-09-23T12:43:41.007 に答える