我需要检测TAdoConnection组件何时丢失与服务器的连接.我尝试过使用OnDisconnect事件,但这仅在调用Close方法或Connected属性设置为false时触发.
我尝试过的另一个选择是使用TTimer并执行这样的查询
SELECT 1 RESULT FROM DUAL
Run Code Online (Sandbox Code Playgroud)
在OnTimer事件中,捕获发生的任何异常.
有没有更好的选择来检测连接丢失?
da-*_*oft 11
我看到了DUAL表.意思是,你正在使用Oracle :)
对于大多数(全部?)客户端/服务器DBMS,除了向DBMS请求某些操作之外,没有办法检测到连接丢失.并且有很多原因,为什么连接会丢失.可能是网络故障,可能是......,可能是DBA关闭了一个DB.
许多DBMS API(包括Oracle OCI)都具有特殊功能,允许ping DBMS."ping"是对DBMS的最小可能请求.上面的SELECT需要比ping更多的工作.
但并非所有数据访问组件(包括ADO)都允许使用DBMS API ping调用ping DBMS.然后你必须使用一些SQL命令.因此,上面的SELECT与ADO是正确的.其他选项 - BEGIN NULL; 结束;.它可能使用较少的DBMS资源(不需要优化器,不需要描述结果集等).
TTimer没问题.查询应在线程中执行,其中使用相应的连接.虽然不是必须的,但这是一个不同的问题.
当连接丢失时,潜在的问题可能是关闭连接.由于DBMS API可能处于失败状态,因此连接关闭可能引发异常.
有点......
| 归档时间: |
|
| 查看次数: |
11583 次 |
| 最近记录: |