0

我必须在数据库中插入一些记录,但这需要 20-25 秒左右的时间。我有两种方法,第一种方法包含一个foreach带有列表类型参数的循环,第二种方法有一些 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();
                }
            }

        }

第二种方法

 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) 代替。它要快得多,因为它会绕过上面提到的脏检查,并且会先查看会话的一级缓存。

但就像其他人所说的那样,您似乎正在删除和反对,然后立即将其放回原处 - 即它通常应该是更新而不是删除+插入。

于 2013-09-15T11:42:09.540 回答