保存到数据库需要花费太多时间

时间:2013-09-13 17:02:35

标签: c# sql linq nhibernate

我必须在数据库中插入一些记录,但是在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();
            }
        }

项目列表包含一些记录。那么如何通过这类问题提高我的表现呢?有没有办法提高我的性能以保存数据库中的记录?

1 个答案:

答案 0 :(得分:3)

使用默认的NHibernate设置,每次查询NHibernate时都会检查会话是否包含可能影响查询结果的任何更改。因此,当会话中活动的对象数量增加时,如果重复查询,性能将下降。

避免在循环中进行查询。最好先查询多个对象。

此外,您似乎是通过主键加载对象,您应该为其使用session.Get(id)。它要快得多,因为它会绕过上面提到的脏检查,并且首先查看会话的第一级缓存。

但是像其他人说的那样,你似乎是删除和对象,然后立即把它放回去 - 也就是说它通常应该是更新而不是删除+插入。