1 つの Hibernate セッションを使用して、同じサーバー上の異なるデータベースにクエリを実行できますか?
-
09-06-2019 - |
質問
新しいことをします SessionFactor
yと Session
オブジェクトはデータベースごとに作成する必要がありますか?アプリケーション データ用のデータ ストアと、ユーザーの検証に使用される従業員セキュリティ用の別のデータ ストアがあります。2 つの異なるデータベースを呼び出すために、新しい SessionFactory と Session オブジェクトを作成する必要がありますか?
解決
これはあなたの質問に直接答えるものではありませんが、データストアごとに複数のセッション オブジェクトを作成する必要がある理由についての洞察を提供するかもしれません。
この記事 では、必要なセッションのタイプごとにスレッド セーフな遅延シングルトンを実装して、データストアごとにセッションを 1 つだけ保持し、アプリケーション全体で共有できるようにする方法について説明します。したがって、最大でもセッション オブジェクトは 2 つだけになります。
ただし、質問に直接答えるには、データベースごとに 1 つのセッション オブジェクトが必要です。
他のヒント
一般的な場合
一般的なケースの答えは「いいえ」です。一般的なケースでは、少なくとも別のセッションが必要です。
次のコマンドを使用して、単一のセッション ファクトリを使用できます。 OpenSession
オープンされた接続を引数として受け取るオーバーロードにより、それを必要とするセッションのデータベースを切り替えることができます。
これには、トランザクション後に接続が自動解放されない、二次キャッシュが無効になるなど、いくつかの欠点があります。私の意見では、セッション開始時に独自の接続を提供するよりも、セッションファクトリーを 2 つ用意した方がよいと思います。
データベース固有のケース
使用するデータベース サーバーによっては、単一の接続文字列を使用して NHibernate で両方にアクセスできる場合があります。単一の接続文字列を使用できる場合は、単一のセッション ファクトリを使用し、同じセッションを使用して 2 つのデータベースに分割されたエンティティにアクセスできます。
最も単純なケース
SQL Server を使用すると、同じ SQL Server 上に 2 つのデータベースを置くことができます。このような場合、単一の接続文字列を使用して、 catalog
あなたの属性 <class>
テーブルがどのデータベースにあるかを伝えるためのマッピング。(schema
ドットを追加することで使用することもできます。NHibernate では以前から利用できるため、古いバージョンでは schema
.)
もちろん、両方のデータベースにアクセスするには、接続資格情報が有効である必要があります。
その他のケース
SQL Server を引き続き使用している場合、2 番目のデータベースが別のサーバー上にある場合は、リンク サーバーを使用できます。もう一度調整します catalog
適切なクラスを指定するためにこの属性を必要とするクラスの属性 linkedServerName.DbName
.
おそらく他のデータベースにも同様のソリューションがある可能性があります。