5

1 つのトランザクションに複数の NHibernate セッションを登録する必要があります。現在、私は次のことを行っています。

1) SQL 接続 dbConn を作成します。

2) ISession session = ISessionFactory.OpenSession(dbConn)を呼び出して、最初のセッションを作成します。

3) session.BeginTransaction()を呼び出して、トランザクションを開始します。

4) コードの後半で、同じ接続で新しいセッションを作成します。

ISession session2 = ISessionFactory.OpenSession(dbConn)

session2 に対してクエリを実行しようとすると、次のエラー メッセージが表示されます。

ExecuteReader では、コマンドに割り当てられた接続が保留中のローカル トランザクションにある場合、コマンドにトランザクションが必要です。コマンドのトランザクション プロパティが初期化されていません。

NHibernate は、同じ接続を再利用しているにもかかわらず、開いているトランザクションに 2 番目の ISession (より具体的には、そのセッション用に作成した Command オブジェクト) を登録していないようです。

同じトランザクション内で複数のセッションを持つ方法はありますか?

100 万を超えるオブジェクトをロードして作成する長時間実行タスクがあるため、単一のセッションを使用できません。1 つの ISession を使用すると、NHibernate フラッシュのパフォーマンスが低下するため、パフォーマンスが 1 秒あたり 3000 件のデータベース リクエストから 20 件に低下します。これを解決するには、短期間のセッションを作成し、それらをすばやく破棄したいと思います。

ただし、プロセス全体がトランザクションにラップされます。独自の接続を持つ独立した後続のセッションを作成すると、それらは最初のトランザクションによって保持されているテーブル ロックにぶつかり、フリーズします。これを解決するには、これらのセッションを同じトランザクション内で実行する必要があります。

4

1 に答える 1

7

できること

  • session.GetSession()同じコンテキスト (接続、トランザクション、モード) で子セッションを作成する
  • カスケードが必要ない場合は、このための StatelessSession を使用してください
  • session.Clear();約50オブジェクトごとに使用
于 2013-05-03T09:03:06.933 に答える