【问题标题】:How can I set a timeout om my query on LinqPad on ExecuteQueryDynamic?如何在 ExecuteQueryDynamic 上的 LinqPad 上设置我的查询超时?
【发布时间】:2019-03-04 09:56:09
【问题描述】:

如何在 ExecuteQueryDynamic 上的 LinqPad 上设置我的查询超时?

Util.CurrentDataContext.ExecuteQueryDynamic($"SELECT count(*) FROM MyDb.dbo.{viewName}");

我想使用这个超时来检测太慢的视图。对于每个视图,我都请求计数,但是当计数花费太多时间时,我就停止它并计算下一个视图。

这是我的完整 LINQPad 代码

void Main()
{
    // In case of error "There is already an open DataReader associated with this Command which must be closed first."
    // https://stackoverflow.com/q/6062192/196526
    // Add MultipleActiveResultSets=true to connection string. 

    var biewsCount = b.V_sysobjects.Where(v => v.Type == "V").Count();
    var bViewsDetail = Util.OnDemand<List<SysObject>>("Get Views Detail", () => GetViewsDetail("b", b.V_sysobjects.Where(v => v.Type == "V").Select(v => v.Name).ToList()));
    bViewsDetail.Dump();
}

public List<SysObject> GetViewsDetail(string database, List<string> objectNames)
{
    var result = new List<SysObject>();
    foreach (var name in objectNames)
    {
        Console.Write($"{database}.dbo.{name}");
        // I should add a timeout stuff here or before
        var count = (int)Util.CurrentDataContext.ExecuteQueryDynamic($"SELECT count(*) FROM {database}.dbo.{name}").Select(y => y).Single();
        Console.Write($" {count}\n");
        result.Add(new SysObject
        {
            Database = database,
            ObjectName = name,
            Rows = count
        });
    }
    return result;
}

public class SysObject
{
    public string Database { get; set; }
    public string ObjectName { get; set; }
    public string ObjectType { get; set; }
    public string IndexName { get; set; }
    public long Rows { get; set; }
    public long? TotalPages { get; set; }
    public long? UsedPages { get; set; }
    public long? DataPages { get; set; }
    public long? TotalSpaceMB { get; set; }
    public long? UsedSpaceMB { get; set; }
    public long? DataSpaceMB { get; set; }
}

【问题讨论】:

  • 喜欢Util.CurrentDataContext.CommantTimeout?
  • 没有改变任何东西
  • 你在使用EntityFramework吗?
  • @Arif 使用的是 LINQPad,所以我使用的是实体框架
  • 你有Util.CurrentDataContext.Database.CommandTimeout这样的属性吗?

标签: c# linqpad


【解决方案1】:

这是 LINQPad 中的一个错误。 ExecuteQueryDynamic 方法应该遵循 DataContextCommandTimeout

此问题现已修复(截至 5.37.4,目前处于测试阶段)。

注意Util.CurrentDataContext 是多余的,除非包含方法是静态的。 Select(y=&gt;y) 也是多余的。所以在你的例子中,你可以这样做:

CommandTimeout = 1;
var count = (int)ExecuteQueryDynamic($"SELECT count(*) FROM {database}.dbo.{name}").Single();

【讨论】:

    【解决方案2】:

    据我所知,除了在客户端设置命令或连接超时,没有办法在服务器中更改查询的超时。

    你可以试试这个方法,对我来说效果很好:

    在运行实际查询之前,为您的查询设置它

    SET LOCK_TIMEOUT 1000;   --1 second
    

    并在运行查询后将其设置回原始值。运行查询的默认值为 600 秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2011-09-15
      • 2019-11-28
      • 2015-10-16
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多