ここに問題があります。私はライブラリが他のWebベースのアプリケーション内で再利用できるように、すべてのリポジトリ、ドメイン、マッピングファイルを保持する共通のクラスライブラリを持っています。このクラスライブラリには、リポジトリで使用されるセッションファクトリを作成するためのコードがあります。コードはこのように見えます。NHibernate SessionFactoryスレッドセーフ
private static ISessionFactory sessionFactory;
private static Configuration configuration;
public static Configuration Configuration()
{
if (configuration == null)
{
configuration = new Configuration().Configure();
}
return configuration;
}
private static ISessionFactory SessionFactory
{
get
{
if (sessionFactory == null)
{
sessionFactory = Configuration().BuildSessionFactory();
}
return sessionFactory;
}
}
public static ISession GetCurrentSession()
{
if (!CurrentSessionContext.HasBind(SessionFactory))
{
CurrentSessionContext.Bind(SessionFactory.OpenSession());
}
return SessionFactory.GetCurrentSession();
}
ので、リポジトリはISessionを取得するGetCurrentSession()メソッドを呼び出します。これでうまくいきますが、スレッドセーフではないかもしれないと心配しています。私はそれをスレッドセーフにするのに役立つ方法で誰かを助けることができますか?注意する
いくつかのこと:
私は開始イベントでのWebアプリケーションのGlobal.asaxの中のSessionFactoryを設定および構築について考えているが、これに伴う問題は、問題の一般的なクラスライブラリが使用されていることです20種類のアプリケーションの中で、これはすべてのアプリケーションに行き、global.asaxファイルを更新することを意味します。これを行う前に、私はこれについて他の方法があるかどうかを調べるために質問を出したいと思っていました。そのため、共通クラスライブラリはSessionFactory自体をコンフィグレーションでき、スレッドセーフであることができます。
この巨大な質問をお読みいただきありがとうございます。助けを借りるでしょう。
ステファンに感謝します。上記のコードでロックに関する簡単な質問。ロックは、各スレッドが独自のSessionFactoryを持ち、2つ以上のSessionファクトリが同じスレッド上に作成されないことを保証しますか? – Bobby
いいえ、ロックにより、最初のスレッドが入ってきて静的セッションファクトリが作成されます。 2番目のスレッドは、最初のスレッドがロックスコープを離れるまで待機する必要があります。後者が来ると、セッションファクトリが作成され、それだけが必要になります。ロックがなければ、セッションファクトリは複数回並列に作成されます。 –
それは完璧です:o) – Bobby