zoukankan      html  css  js  c++  java
  • TADOConnection如何测试连接数据库超时的解决办法

    TADOConnection如何测试连接数据库超时的解决办法

     TADOConnection 提供了很好的数据库连接功能,但是我们在实际使用时,如果指定的远程数据库不存在或其他原因连接不上,程序往往会假死并等待很长时间,很是不友好。实际上可能您也已经尝试将ConnectionTimeout属性设为5秒甚至更小,但好像并不起到什么作用。问题究竟出在哪里?我们来先看一下Delphi的帮助文档。
     

    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毫秒检测一次是否连接成功,如果成功就返回,否则就继续等待直到超时。

  • 相关阅读:
    PHP发送邮件标题乱码的解决
    PHP方法之 mb_substr
    HTML 文件类表单元素如何限制上传类型,Accept属性设置
    Jquery 自定义动画同步进行如何实现?
    王小胖之 Base64编码/解码
    王小胖之 URL编码和解码
    王小胖之中文汉字转拼音
    跟左神学算法7 进阶数据结构(哈希相关)
    操作系统复习笔记1
    计算机网络复习笔记2
  • 原文地址:https://www.cnblogs.com/bingege/p/7902445.html
Copyright © 2011-2022 走看看