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. (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)

    layout: post title: (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) au ...

  2. SHELL 在指定行的前/后插入指定内容

    #如果知道行号可以用下面的方法 sed -i '88 r b.file' a.file    #在a.txt的第88行插入文件b.txt awk '1;NR==88{system("cat ...

  3. Tomcat线程池实现

    目前市场上常用的开源Java Web容器有Tomcat.Resin和Jetty.其中Resin从V3.0后需要购买才能用于商业目的,而其他两种则是纯开源的.可以分别从他们的网站上下载最新的二进制包和源 ...

  4. Annotation的语法和使用

    http://blog.csdn.net/cdl2008sky/article/details/6265742 (1) .<context:component-scan base-package ...

  5. POJ 3168 Barn Expansion (几何基础)

    [题目链接] http://poj.org/problem?id=3168 [题目大意] 给出一些矩形,没有相交和包含的情况,只有相切的情况 问有多少个矩形没有相切或者边角重叠 [题解] 我们将所有的 ...

  6. 分析成绩 Exercise07_04

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:分析成绩 * */ public class Exercise07_04 ...

  7. java web定时任务---Timer

    写在前面: 在最近的项目中需要每天定时对数据库表进行查询,并完成相关数据的更新操作.首先让我想到的是Timer类,记得在一开始维护那个老系统的时候,开了个接口,也涉及到了定时的操作.下面就记录下大概的 ...

  8. STL之vector2

    描述 依次输入n个整数,每次输入时检查该值是否已经出现在vector中,如果存在则不插入,否则将其插入到开头位置. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() ...

  9. 可见性-volatile

    出处: http://blog.csdn.net/vking_wang/article/details/9982709

  10. 【mybatis】idea中 mybatis的mapper类去找对应的mapper.xml中的方法,使用插件mybatis-plugin

    idea中 mybatis的mapper类去找对应的mapper.xml中的方法,使用插件mybatis-plugin,名字可能叫Free mybatis-plugin 安装上之后,可能需要重启ide ...