12

nHibernate セッションを使用する多くの永続化呼び出しを含むメソッドがありましたが、それは機能し、問題ありませんでした。しかし、マルチスレッドの理由から、ループ内のコンテンツからメソッドを抽出して、このメソッドをリファクタリングする必要がありました。次に、このメソッドでクラスを作成しました。通常のリファクタリングのようなものですが、このメソッド呼び出し内の nHibernate セッションが壊れており、コンテキストがなく、どの時点でもファイナライズしていません。マルチスレッドで nHibernate に問題がありますか? もう 1 つのスレッドしか実行していない場合でも、同じ問題が発生します。

私は、SessionFactory と Façade パターンを通じて nHibernate Session を使用しています。つまり、セッションはこれらのオブジェクトのフィールドではなく、SessionFactory でグローバルです。


もう少し明確にする:

前:

Method()
{
... persistence calls
foreach(Thing..)
{
...persistence calls for each thing (1)
}
...
}

後:

Method()
{
... persistence calls
foreach(Thing..)
{
create a thingResolver object with some data
open a new thread with thingResolver.Method (1)
starts this thread
}
.. waits for finishing threads and continues
}

nHibernate セッション ファクトリはスレッド対応で、スレッドごとに nHibernate セッションを保存/取得します。それは今うまく機能しています;)

4

2 に答える 2

17

セッションは設計上、NHibernateではスレッドセーフではありません。したがって、セッションが 1 つのスレッドのみで使用されている限り問題ありません。

あなたがthingResolverが何をしているのかはわかりませんが、元のスレッドで作成した同じセッションでいくつかの永続化呼び出しを行う場合-これがおそらく問題の原因であり、新しいセッションで別のセッションを作成できます私の仮定が真であれば、それはスレッドごとのセッションになるようにスレッド。

NHibernate のリファレンスには、セクション 10.2 があります。

http://nhibernate.info/doc/nh/en/index.html#transactions

于 2008-10-28T11:40:42.767 に答える
0

スレッドごとに個別の NHibernate セッションがある限り、複数のスレッドに対して 1 つの NHibernate SessionFactory を持つことができます。

各スレッドに同じセッションを使用するため、例外が発生する例を次に示します。

https://forum.hibernate.org/viewtopic.php?p=2373236&sid=db537baa5a57e3968abdda5cceec2a24

解決策は、セッションを LocaldataStoreSlot に保存することです。これにより、リクエストごとのセッション モデルを作成できます。

于 2011-01-08T21:06:34.807 に答える