TADOConnection如何测试连接数据库超时的解决办法
Unit: ADODB
Type: property
Visibility: public
Member Of: TADOConnection
Description
Specifies amount of time to attempt a connection.
指定一个尝试连接的等待时间
Use ConnectionTimeout to specify the amount of time, in seconds, that can expire before an attempt to make a connection is considered unsuccessful. The default value is 15 seconds.
If a connection is successfully made prior to the expiration of the seconds specified or the Cancel method is called, ConnectionTimeout has no effect. If the specified time expires and a connection has not been successfully made, the attempt is terminated and an exception is raised.
使用ConnectionTimeout来指定一个时间长度,以秒为单位,以指定在尝试连接不成功时要等待的时间。默认值为15秒。
如果连接成功并早于指定的等待时间或者在此期间调用了Cancel方法,ConnectionTimeout 就不会起作用。如果已经超出这个等待时间,尝试连接依然没有成功,这个连接尝试就会终止并会抛出一个连接“异常”。
从文档的说明来看,如果我们想减少等待时间就是应该把ConnectionTimeout 属性的值设小一点。这跟我们的理解是一致的。其实,是文档没有说明清楚,我们还应该设置一下另外的一个属性,而且这是必须的:
Conn.ConnectOptions := coAsyncConnect; //must be coAsyncConnect!
这样做的目的就是将连接的过程设为异步的,从而让连接超时程序能够很快地退出等待。否则,你指定的这个等待时间无论长短都不会起到任何作用,程序一直会等待超过30秒的时间。这个没得解释,不管你愿意不愿意,想让ConnectionTimeout起作用这个参数必须这样设!听起来很霸道啊!
如果不想改变原来的连接选项,我写了一个专门的用作测试连接的函数,可以独立使用。原理很简单,就是在其内部创建一个异步方式的连接,附上指定的连接字符串和等待时间,如果在等待时间结束前连接成功函数会返回true,否则返回false。这个函数体看起来很简单,很好理解,不过需要说明的是,其等待时间并不是很准确,有时候会比你指定的等待时间要长一点点,顶多多出2~3秒的样子,所以我把ATimeOut的默认值设为5。
function TryAdoConnect(const AConnStr: string; ATimeOut: DWORD=5): Boolean;
var FConn: TADOConnection;
begin
FConn := TADOConnection.Create(nil);
try
FConn.LoginPrompt := False;
FConn.ConnectionTimeout := ASecTimeOut;
FConn.ConnectionString := AConnStr;
FConn.ConnectOptions := coAsyncConnect; //must be coAsyncConnect!
try
FConn.Open();
result := FConn.Connected; //Waiting... //ok.
except
end;
finally
FConn.Free;
end;
end;
如果这个方式你依然不满意,那么我们可以另写一个专门的等待线程,每隔10到50毫秒检测一次是否连接成功,如果成功就返回,否则就继续等待直到超时。