我正在使用Entity Framework 6访问API应用程序中的SQL Server。 API服务器和数据库服务器是分开的。我有一个已知的长查询,运行时间超过一分钟。我使用以下代码在我的EF DbContext上设置了CommandTimeout:
db.Database.CommandTimeout = 20 * 60; // 20 minutes
不幸的是,这似乎没有任何影响,因为查询在不到一分钟的时间内仍然超时,服务器返回504网关超时错误。
为什么此更改对命令执行时间限制没有任何影响?
我还应该做些什么来让这个查询运行更久?
更多细节:
我编写了一个桌面应用程序,它对API服务器进行API调用,后者又向数据库服务器发出查询。在桌面应用程序端,我设置了HttpClient属性:
httpClient = new HttpClient { Timeout = new TimeSpan( 0, 20, 0 ) };
在API服务器端,我已设置执行超时:
<system.web>
<httpRuntime requestPathInvalidCharacters="" maxRequestLength="2097151" executionTimeout="30000" />
</system.web>
在API服务器上,我按上述方式设置了SQL命令超时。
在某些时候,响应总是在不到一分钟后结束,尽管事实上我已将所有超时设置为20分钟。我假设504是由db超时引起的,但我想它与桌面应用程序和API服务器之间的可能性差不多。
无论如何,我的想法已经用完,所以任何事情都会有所帮助。
答案 0 :(得分:2)
原来还有一个我没想过的超时设置。因为我使用Elastic Beanstalk在Amazon Web Services上托管API和数据库服务器,所以桌面应用程序和API服务器之间有一个Load Balancer。默认超时为60秒。以下是增加Load Balancer超时设置的链接:
http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/config-idle-timeout.html