私はまだこれらのテクノロジーにかなり慣れていません。ここでの本当の問題は、コンソール アプリでスレッドごとにセッションを管理する方法です。現在、シングル スレッドとして実行すると、すべて問題ありません。マルチスレッド モデルに切り替えるとすぐに、セッション レベルで競合が発生し始めます (Session オブジェクトは設計上アドセーフではないため) KeyNotFound 例外 (とりわけ) がスローされ始めます。
Web アプリでは、次のようにします。
/// <summary>
/// Due to issues on IIS7, the NHibernate initialization cannot reside in Init() but
/// must only be called once. Consequently, we invoke a thread-safe singleton class to
/// ensure it's only initialized once.
/// </summary>
protected void Application_BeginRequest(object sender, EventArgs e)
{
NHibernateInitializer.Instance().InitializeNHibernateOnce(
() => InitializeNHibernateSession());
}
/// <summary>
/// If you need to communicate to multiple databases, you'd add a line to this method to
/// initialize the other database as well.
/// </summary>
private void InitializeNHibernateSession()
{
var path = ConfigurationManager.AppSettings["NHibernateConfig"];
NHibernateSession.Init(
webSessionStorage,
new string[] { Server.MapPath("~/bin/foo.Data.dll") },
new AutoPersistenceModelGenerator().Generate(),
Server.MapPath("~/App_Configuration/" + path ));
}
// sample of my console app... very simple
static void Main(string[] args)
{
InitializeNHibernateSession();
while(true)
{
Task.Factory.StartNew(() => SomeAwesomeLongRunningPieceOfWork());
}
}
これは基本的に、global.asax のスレッド (Web 要求) ごとに 1 回初期化を実行します。
コンソール アプリでこれ (セッション管理) を設定する方法についてのアイデアはありますか?