【问题标题】:Saving to database taking too much time保存到数据库需要太多时间
【发布时间】:2013-09-18 10:52:12
【问题描述】:

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

项目列表包含一些记录。那么我如何才能在这类问题上提高我的表现。有什么方法可以提高我在数据库中保存记录的性能?

【问题讨论】:

  • 不要单独查询每个项目,以便删除它。而是查询所有项目,将它们全部标记为删除,然后将整个批次提交回数据库。
  • 你能把session.Query&lt;TIVGroupItem&gt;()移动到InsertAssignment并作为参数传递给ak_tIVGroupItemSelector_Insert吗?
  • 亚历山德罗·德安德里亚:我没听懂你。
  • 删除再插入有什么意义?更新不是更好吗?
  • java版本的hibernate有session.saveOrUpdate(object)。第一种方法,能不能把_tIVGroupItemSelector_Insert(item);换成session.saveOrUpdate(item);

标签: c# sql linq nhibernate


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多