【问题标题】:SQL connection timeout error with Entity Framework实体框架的 SQL 连接超时错误
【发布时间】:2018-09-21 06:18:01
【问题描述】:

我正在使用entity framework 一次更新table 中的2600 条记录。

它以前可以工作,但现在突然开始每次都抛出timeout error

timeout 属性设置为 150。

另外,多个用户同时使用application

下面是code

    foreach (var k in context.Keywords.Where(k => k.CurrentDailyCount > 0))
            {
               k.CurrentDailyCount = 1;
            }

            context.SaveChanges();

这是我面对的error

error 背后的问题可能是什么?它工作正常,但突然开始抛出timeout error

【问题讨论】:

  • 您确认它没有遇到某种数据库锁吗?查看生成的 SQL 命令以查看它是否挂在任何特定实体上,还是只是缓慢并在 150 秒后超时?

标签: sql .net entity-framework asp.net-core


【解决方案1】:
var entries = context.Keywords.Where(k => k.CurrentDailyCount > 0) ?? new List<Keyword>(); 
foreach (var k in entries)
{
   k.CurrentDailyCount = 1;
}

await context.SaveChangesAsync();
  1. 将过滤后的关键字存储在一个变量中以节省时间进行搜索: context.Keywords.Where(k =&gt; k.CurrentDailyCount &gt; 0)
  2. 确保 过滤后的关键字绝不为空?? new List&lt;Keyword&gt;()
  3. 保存记录异步await context.SaveChangesAsync();

【讨论】:

  • 你的代码好像编译不成功。此外,由于延迟加载功能,将context.Keywords.Where(k =&gt; k.CurrentDailyCount &gt; 0) 存储到变量不会节省时间。
  • 除非您使用的是 .NET 2.0 和 Visual Studio 2005,否则代码应该可以编译。只要确保你的方法用async关键字装饰。
【解决方案2】:

首先,您可以考虑只选择primaryKey 字段和CurrentDailyCount。你可以让它像

context.Keywords.Select(x => new Keyword(){
   PrimaryKeyColumn = x.primaryKeyColumn,
   CurrentDailyCount = x.currentDailyCount 
}).Where(k => k.CurrentDailyCount > 0)

你还应该检查你的 sql 语句的执行时间。如果 CurrentDailyCount 列未编入索引,则您的代码出现超时错误也就不足为奇了。

超时属性设置为 150。

您要解决哪个超时?是 SQL 连接超时还是 Kestrel 服务器超时?如果您将 SQL 超时时间设置为 150 并且 kestrel 超时值为默认值(即 120 秒),您的代码会在达到 120 秒时中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 2013-08-26
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多