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

TADOConnection如何测试连接数据库超时的解决办法的更多相关文章

  1. asp.net连接数据库超时的解决办法

    错误提示:“超时时间已到.超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小.  ” 经过几天辛苦写的代码,终于实现了功能丰富的查询功能,但是使用的过 ...

  2. HTTP 408请求超时错误解决办法

    错误描述 对于大多数网站而言,我们所看到的错误消息已经是开发者定制过的页面,比如我们最常见的自定义404错误页面,一般而言,我们看到的408错误应该是类似这样的提示:“408:Request Time ...

  3. Windows开启关闭测试模式的方法(含开启测试模式失败的解决办法)

    前言:           内含:Windows开启关闭测试模式的方法.开启测试模式失败的解决办法.win10进入bios的方式.BitLocker恢复方式.           对于互联网从业者来说 ...

  4. Github网站加载不完全,响应超时,解决办法

    Github网站加载缓慢信息不全解决方法 Github是一个代码托管平台和开发者社区,开发者可以在Github上创建自己的开源项目并与其他开发者协作编码.毫不夸张地说,高效利用Github是一个优秀的 ...

  5. 该死的Kafka,远程连接Kafka超时以及解决办法

    关于消息的发布与订阅,之前一直使用的是activeMQ基于JMS的消息队列进行操作的,最近听说有一个更高效的消息的发布与订阅技术,就是Kafka. 关于kafka的介绍,在这里就不做过多讲解了,因为我 ...

  6. Docker镜像拉取失败或超时的解决办法:添加国内镜像

    $ docker pull php:7.1-fpm-alpine Error response from daemon: Get https://registry-1.docker.io/v2/: n ...

  7. DEDE织梦 后台特别卡,有时响应超时的解决办法

    跟大家一样,大致情况是: 1.打开后台首页第一次没问题,但是刷新或者点其他菜单就一直卡着了. 2.关掉浏览器重新进首页没问题,但是一旦进了首页再打开php页面就卡死了. 3.服务器返回Maximum ...

  8. mysql导入sql文件过大或连接超时的解决办法

    前段时间出差在现场开发的时候,导入数据库老是出问题.最后发现了一个神奇sql语句交给实施,只要导入出错就把如下语句执行就可以了.至今屡试不爽. 1 2 3 4 5 6 7 set global max ...

  9. MySQL导入SQL文件过大或连接超时的解决办法/在navcat执行sql卡在0%

    set global max_allowed_packet=100 000 000;set global net_buffer_length=100000;SET GLOBAL  interactiv ...

随机推荐

  1. 潜伏者(noip09年t1)解题报告 C++

    题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...

  2. 【树链剖分】【树状数组】【最近公共祖先】【块状树】bzoj3631 [JLOI2014]松鼠的新家

    裸题,树状数组区间修改+单点查询.当然要稍微讨论一下链的左右端点是否修改的情况咯. #include<cstdio> #include<algorithm> #include& ...

  3. struts-2-spring-2-jpa-ajax

    http://struts.apache.org/docs/struts-2-spring-2-jpa-ajax.html

  4. [转] matlab获取时间日期

    原文:EmanLee, Eman Lee's Space (blog, website) 在MATLAB中得到系统当前日期.时间也是经常用到的内容,由以下函数实现. 1.生成指定格式日期和时间 dat ...

  5. ASP.NET MVC DropdownList的使用

    1:直接使用HTML代码写 <select name="year"> <option value="2011">2010</opt ...

  6. SHAREPOINT 2013 + PROJECT 2013 资料网站

    1.http://technet.microsoft.com/zh-CN/sharepoint 2\ 博客圆专业讲解  http://www.cnblogs.com/jianyus/archive/2 ...

  7. fetch的用法

    fetch api是被设计用来替换XmlHttpRequest的,详细用法如下: http://javascript.ruanyifeng.com/bom/ajax.html#toc27

  8. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点动面板的每个按钮含义

    参考下面的图示     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123   我的在线论坛: http://csrobot.g ...

  9. J2EE之EJB

     EJB是sun的JavaEEserver端组件模型,最大的用处是部署分布式应用程序.EJB把使用java开发的server组件的部署和开发进行标准化. 凭借java跨平台的优势.用EJB技术部署的分 ...

  10. C#秘密武器之LINQ to SQL

    LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...