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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保存到数据库需要花费太多时间相关的知识,希望对你有一定的参考价值。

我必须在数据库中插入一些记录,但它需要花费太多时间大约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();
            }
        }

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

答案

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

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

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

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

以上是关于保存到数据库需要花费太多时间的主要内容,如果未能解决你的问题,请参考以下文章

BLE 在将数据从 iOS 7.1 发送到 iOS 8 时花费了太多时间

为啥 Android 中的 VideoView 需要花费太多时间来加载和播放来自 http 链接的视频?

使用标量函数执行查询花费了太多时间

UIScrollView 花费太多时间

查询花费了太多时间与恼人的性能[关闭]

与 SqlDataAdapter.Fill() 相比,DataTable.Load() 花费了太多时间