0

データベースにレコードを挿入する必要がありますが、20 ~ 25 秒ほど時間がかかりすぎます。最初にリスト型パラメーターを持つループを含む2つのメソッドがforeachあり、2番目のメソッドにはいくつかのレコードを保存および削除するためのLinqクエリがあります。コードを以下に示します。

 public void InsertAssignment(List<TIVGroupItem> Item)
        {
            using (var tr = session.BeginTransaction())
            {
                try
                {
                    foreach (var item in Item)
                    {
                        ak_tIVGroupItemSelector_Insert(item);
                    }                
                    tr.Commit();
                }
                catch (Exception ex)
                {
                    tr.Rollback();
                    CusException cex = new CusException(ex);
                    cex.Write();
                }
            }

        }

2番目の方法

 public void ak_tIVGroupItemSelector_Insert(TIVGroupItem GroupItem)
        {
            try
            {
                var result = (from i in session.Query<TIVGroupItem>()
                              where i.Id == GroupItem.Id
                              select i).SingleOrDefault();
                if (result != null)
                    session.Delete(result);
                session.Save(GroupItem);
            }
            catch (Exception ex)
            { CusException cex = new CusException(ex);
                    cex.Write();
            }
        }

アイテム リストにはいくつかのレコードが含まれています。では、この種の問題でパフォーマンスを向上させるにはどうすればよいでしょうか。データベースにレコードを保存するパフォーマンスを向上させる方法はありますか?

4

1 に答える 1

3

デフォルトの NHibernate 設定では、クエリを実行するたびに、NHibernate はクエリの結果に影響を与える可能性のある変更がセッションに含まれているかどうかを確認します。そのため、セッションでアクティブなオブジェクトの数が増えるにつれて、クエリを繰り返し実行すると、パフォーマンスが低下します。

ループ内でクエリを実行することは避けてください。事前に複数のオブジェクトを照会することをお勧めします。

さらに、主キーでオブジェクトをロードしているように見えます。これには、代わりに session.Get(id) を使用する必要があります。上記のダーティ チェックをバイパスし、最初にセッションの第 1 レベルのキャッシュも検索するため、はるかに高速です。

しかし、他の人が言ったように、あなたは削除して反対し、すぐに元に戻しているようです-つまり、通常は削除+挿入ではなく更新する必要があります。

于 2013-09-15T11:42:09.540 に答える