複数のデータベースを持つNHibernate WebappどのSessionContextを使用するか

私たちはWebアプリケーションで流暢な設定でNHibernateを使用します。

我々は、単一の構成データベースと、顧客データを保持する多数の異なるデータベースを持っています。

各データベースについて、我々は流暢な構成とそれが初めて使用されるときのSessionFactoryを作成する。

OpenSessionメソッドを呼び出すことによってセッションを取得し、処理が完了するとそのセッションを破棄します。

しかし時には、私たちが読み込みを試みたときにADOデータリーダがまだアクティブであるというエラーメッセージが表示されることがあります。 NHibernateが同じ接続を(再)しようとしていることを示しています。

データベース要求がアトミックな方法で接続によって処理されるようにするにはどうすればよいでしょうか。 (他のリクエストでは再利用できません)

私はSessionFactoryの再作成がうまくいくかもしれないと思うが、それは高価なようだ

0

1 答え

いくつかの質問

  • 異なる接続文字列を使用しているため、別々のアプリケーションプールですか?
  • 正確なエラーメッセージは何ですか?

これがどのようにnHibernateの欠陥であるべきかわかりません。問題が容易に再現可能な場合は、おそらくあなたが試みることができます:

  • データベース側からトレースして、何が起こっているかを確認します(特にsp_resetconnection)。
  • 違いがあるかどうかを確認するために接続プーリングを無効にする
2
追加された
私の誤植を修正するための@mxmissileありがとうございました<):O)} {
追加された 著者 k.c.,
@ Miracleforhire:私たちは異なる接続プールを持っています(データベースごとに、ADO.Netのデフォルト)。しかし、一連のWebリクエスト中に中央データベースが読み込まれるときに問題が発生します。 NHibernateは、前のリクエストが終了する前に新しいリクエストと同じデータベース接続を行います。いくつかの内部接続/セッションキャッシングはおそらく? SessionFactory.OpenSession()を呼び出すたびに、「新しい」セッション(プールから「クリーン」な接続)をしたいです。
追加された 著者 k.c.,
中央データベースのすべてのセッションは、単一のセッションファクトリから取得されます。使用中の接続が確立されないように、毎回セッションファクトリを再作成する必要がありますか?接続プールは、前のプロセスで閉じられた接続のみを提供するので、問題はないと思います。
追加された 著者 k.c.,
私と一緒にこれに取り組んでくれてありがとう!
追加された 著者 k.c.,
問題を引き起こすのは2つの異なるSessionFactoryだと確信していますか?複数のスレッドで1つのセッションを使用していないことを確認してください。あなたがそれを混乱させていると確信しているなら、nHibernateのConnectionProviderクラスを見てください。そして、そのソースから呼び出された場所はかなり簡単です。
追加された 著者 jakobandersen,