0

同じISessionでsession.Get(id)を2回実行するコードがあります。ISessionが2つのidbconnectionsを作成していることがわかります。これはある種の構成によるものだと思います。同じidbconnectionでフェッチを実行したいと思います。どのように?

4

1 に答える 1

1

両方のGet操作が同じトランザクション内にある場合、それらは同じ を共有しIDbConnectionます。そうしないと、暗黙的なトランザクションが発生し、NHibernate がIDbConnectionfor each クエリを開いたり閉じたりします。一般に、次のようなことを試してください。

using (var tx = session.BeginTransaction())
{
    var customer = session.Get<Customer>(123);
    var order = session.Get<Order>(456);

    // do stuff

    tx.Commit();
}

暗黙的なトランザクションの使用はお勧めできません:

独自のトランザクションを定義しないと、暗黙的なトランザクション モードにフォールバックし、データベースへのすべてのステートメントが独自のトランザクションで実行されるため、パフォーマンス コストが大きくなり (データベースがトランザクションを構築および破棄するのにかかる時間)、一貫性が低下します。 .

データを読み取るだけの場合でも、トランザクションを使用する必要があります。トランザクションを使用すると、データベースから一貫した結果が得られることが保証されるからです。NHibernate は、データベースへのすべてのアクセスがトランザクションの下で行われることを想定しており、トランザクションなしでセッションを使用することは強くお勧めしません。

于 2011-03-12T17:06:15.557 に答える