一。错误信息
Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。(单机非镜像数据库)
Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。 尝试连接到
Principle 服务器时发生了此故障。
Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。 尝试连接到 Failover
服务器时发生了此故障。
二。普及下关于Timeout之前和之后的那些事
连接数据库镜像出现超时(timeout)的可能原因(引用微软的权威解释,便于大家理解我有补充)
1.客户端程序连接镜像数据库和非镜像数据库的方式是有差别的。
2.当数据库是镜像数据库的时候,你在connection
string里面指定的timeout值和非镜像数据库的timeout值尽管大小一样,但实际上效果是不一样的。对于镜像数据库,客户端数据库接口(通常是SqlClient
或者SQL native
client)有连接重试算法。非镜像数据库是没有的。
3.那么镜像数据库的连接算法怎样呢
假定你指定connection timeout 15
秒:
第一轮:连接主机,超时时间为总timeout的8% 即:15*8%=1.2秒
这时候如果连接没有成功,就试图连接备机,超时时间也是1.2秒(镜像数据库连接串中是双地址)
第二轮:如果连接备机失败,这时候,客户端数据库接口再试图连接主机,超时时间设为
总timeout的16% 即:15*16%=2.4秒。 如果没有成功,就连接备机,超时时间也是2.4秒。
第三轮,超时时间是总timeout时间的24%。在后续的每轮中,连接尝试的重试时间会逐渐变大。前八次连接尝试的重试时间如下:
8%, 8%, 16%, 16%, 24%, 24%, 32%,
32%
(此过程,数据库状况一直是健康的)
重试时间使用以下公式进行计算:
RetryTime = PreviousRetryTime + ( 0.08 * TotalLoginTimeout )
1.2+1.2+2.4+2.4+3.6+3.6=14.4(秒)
也就是说,对于15秒的timeout值,实际连接主机的最大timeout值是3.6秒! 如果前面3次连接(1.2秒,2.4秒,3.6秒)都不成功,那么15秒超时时间就到了,你程序就会报超时错误。
附图:
三。解决方案
要增加连接主机的真实timeout值,你只能增加总的connection
timeout值。比如如果超时设为120秒,那么第一轮的重试时间是
120*8%=9.6秒。
即便如此,第一轮的尝试连接时间还是比非镜像数据库的缺省15秒timeout时间要短。
所以我个人建议
1.修改Web.config配置文件,设置ConnectTimeout的值
300~500之间比较合适
2.改command对象的CommandTimeout属性,cmd.CommandTimeout = 30~180
具体依据客户的体验结果为准;
3.关于数据库镜像字符串我再强调几个参数,
max pool size=800;
min pool size=300;
Network=dbmssocn;
Failover Partner=10.100.X.X;