Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the s
作者:C/S框架网|www.cscode.ne  发布日期:2020/05/15 21:00:04
  Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the s

Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the s


引言

我们在操作数据过程中,特别是数据库比较大(数据库>1GB,单表记录达千万级)的情况下,偶尔会出现程序连接超时的错误,例如:

Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.


下面总结一些经验仅供参考:


1. 检查Connection使用后是否关闭。Open->Executing->Close。

2. 如果将SQL语句复制到查询分析器中执行,如果执行时间本来就超过30秒,那么一般采用如下的解决方案:

首先分析引起Timeout的原因,一般是SqlCommand.CommandTimeout引起的, SqlCommand的此方法为获取或设置在终止执行命令的尝试并生成错误之前的等待时间,默认为 30 秒,你可以设置为0 ,它表示无限制,但是最好不要去设置0 ,否则会无限的等待下去的,只需要针对查询分析器的时间,去设置这个时间就可以了。

3. 检查程序逻辑是否有事务、多表更新,是否有并发操作、锁表等行为。通常事务锁会造成等待超时!

4. 执行时间不是很长,但是还是操作超时,有多种原因,一般经常出现的有两种,ASP.NET应用程序的请求超时,或者是连接池的连接生存期过时,因为连接池默认值是60秒,那么针对这两种解决方案为:


解决应用程序请求超时,在web.config中加上以下语句:


XML Code:

<system.web>
    <httpRuntime maxRequestLength="102400" executionTimeout="720" />
</system.web>

//来源:C/S框架网 | www.csframework.com | QQ:23404761


executionTimeout:是允许执行请求的最大时间限制,单位为秒
maxRequestLength:指示 ASP.Net 支持的最大文件上载大小。单位:KB

解决程序池生存周期问题,在SQL连接字符串中修改:


Text Code:

database=AA;uid=sa;
pwd
=sa;
Pooling
=true;
MAX Pool Size=1024;
Min Pool Size=1;
Connection Lifetime
=60 (单位:秒)


//来源:C/S框架网 | www.csframework.com | QQ:23404761




关于连接池及Connection Lifetime参数:


    (1)每当一个连接使用完后释放回连接池,如果当前时间减去该连接建立的时间的值大于Connection Lifetime设定的值(秒),该连接被销毁。Connection Lifetime是用于集群数据库环境下。例如一个应用系统的中间层访问一个由3台服务器组成的集群数据库,该系统运行一段时间后发现数据库的负荷太大而需要增加第4台数据库服务器。如果不设置Connection Lifetime,你会发现新增加的服务器很久都得不到连接而原来3台服务器的负荷一点都没减少。这是因为中间层的连接一直都不会销毁而建立新的连接的可能性很小(除非出现增加服务器之后数据库的并发访问量超过增加前的并发最大值)。


    注意:Connection Lifetime很容易让人产生误解。不要认为Connection Lifetime决定了一个连接的生存时间。因为只有连接被释放回连接池的时刻(Close连接之后)才会检查Connection Lifetime值是否达到而决定是否销毁连接,而连接在空闲或者正在使用的时候并不会检查Connection Lifetime。这意味着绝大多数情况下连接从建立到销毁经过的时间比Connection Lifetime大。另外,如果Min Pool Size为N (N > 0),那么连接池里有N个连接不受Connection Lifetime影响。这N个连接会一直在池里直到连接池被销毁。


    (2)当发现某个连接对应的“物理连接”断开(这种连接称为“死连接”),例如数据库已经被shutdown、网络中断、SQL Server的连接进程被kill、Oracle的连接会话被kill,该连接被销毁。“死连接”出现后不是立刻被发现,直到该连接被占用来访问数据库的时候才会被发现。

    注意:如果执行Open()方法时候Data Provider只需从连接池取出已有的连接,那么Open()并没有访问数据库,所以这时候“死连接”还不能被发现。



C/S开发框架解决方案参考:


1. 针对出错的数据更新数据库统计数据、更新索引


SQL Code:

EXEC sp_updatestats;



贴图图片-Execution Timeout Expired


2. 设置连接超时、命令超时


贴图图片-Execution Timeout Expired (2)


3. 优化出错代码部分的程序逻辑,检查是否有数据库事务处理、多表更新等。


4. 记录出错日志,方便追溯、跟踪和调试。


C/S框架网|原创精神.创造价值.打造精品

扫一扫加微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务


上一篇 下一篇