背景:
遇到我们的生产系统中的问题,其中实体框架查询在30秒后没有超时。我们正在使用SQL Server 2014。
有一次,我们 看到超时(即如果我运行sql探测器跟踪,我们会看到它运行30秒然后抛出超时错误)。但是最近那些没有生成,我看到一些有问题的查询运行很长时间。当我们不再看到它们时,我没有特定的时间或变化。
这是数据库的第一个上下文。我们的Context.tt文件已经过修改,可以将两个存储过程的CommandTimeout更改为120秒,将另外6个存储过程更改为0(无限超时)。
public string FunctionTimeout(EdmFunction edmFunction, string modelNamespace)
{
if (edmFunction.Name == "StoredProc1" || edmFunction.Name == "StoredProc2")
return string.Format("((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 120;");
else if (edmFunction.Name == "StoredProc3" || edmFunction.Name == "StoredProc4" )
return string.Format("((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 0;");
else
return "";
}
我们的dbcontext在Autofac中注册如下
var builder = new ContainerBuilder();
builder.RegisterType<MyContext>().AsSelf().InstancePerLifetimeScope();
这是在Windows服务中运行,但数据层也与web api项目共享。
.NET Framework 4.5.2
实体框架6.1.3
Autofac 4.6.1
所以提问时间:
1)设置CommandTimeout是否将其设置为“全局”级别? (即一旦我们的系统碰巧调用上面的一个存储过程,那么之后的每个EF调用都没有超时或超时2分钟)
2)是否有一个钩子(在模板或其他地方)将其设置回常规EF调用之前的30秒(即在常规实体上的LINQ查询之前),而不仅仅是存储过程(即添加返回值)在上面的其他声明中)?
3)将CommandTimeout添加到构造函数帮助吗?
public <#=code.Escape(container)#>()
: base("name=<#=container.Name#>")
{
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 30;
<#
if (!loader.IsLazyLoadingEnabled(container))...