delphi客户端与SQL服务器连接失败时如何缩短报错时间

Delphi code:
procedure Tyhjm.FormCreate(Sender: TObject);
begin
try
begin with adoconnection1 do
begin
ConnectionString:=('xxx');
adoconnection1.loginprompt:=false;
connected:=true;
end;
end
except
adoconnection1.connected:=false;
adoconnection1.loginprompt:=false;
application.MessageBox('服务器异常或程序需要更新','提示',64);
end;
if adoconnection1.connected=true then begin
statusbar1.Panels[0].Text:='服务器状态:正常';
end else begin
statusbar1.Panels[0].Text:='服务器状态:异常';
end;
end;
//sql服务器轮询时间:5S adoconnection1.commandtimeout:=1
adoconnection1.connectedtimeout:=1
commandTO跟connectTO不改之前是40秒左右的假死,现在是6~15秒等待时间。
最新回答
往事归零

2024-10-17 12:22:10

  1. 设计应与实际应用场景相符合。

    在用户场景下,一般服务器搭建在公司内或托管在其他服务提供商的服务器内。由于不同地区的用户访问时,网络有不固定延迟。此类属于正常情况。无需快速返回错误。

    假设用户因网络缘故连接到SQL SERVER需要10s,但是你的连接超时是5s,用户本来是可以进行访问的,但是由于你的连接超时太短,会造成无法正常连接。

    一般来说,影响连接时间有很多原因。内存开销过大,CPU被占用,网络带宽不够,线路不好。IO被大量占用。

    如果是单机访问,速度应该还是会很快的。

  2. 关于快速返回失败的方式。

    如果确实需要快速返回连接错误,在同步连接时,将超时属性设置为10ms左右即可。具体数值根据实际应用环境确定。

    此外需要考虑SQL Server服务端的配置信息。

  3. 正常对于传输类场景如何进行优化处理。

    对于大量网络传输的场景,比如大量查询,多次调用同一段sql。可以考虑使用sql的缓存机制,多表联合查询时,考虑连接条件。单表查询时,考虑创建正确的索引。对于常用而无需经常变动的数据,考虑使用多线程在后台加载,并建立内存表,同时考虑同步机制。对于事务考虑锁的颗粒度。等等以上,都是常见的处理方式。

晨曦慕雪

2024-10-17 10:48:40

timeout属性设置仅能缩短有限的时间,我常用的方法是在splash和主窗体运行前单独一个线程专门数据库连接
夏了夏天

2024-10-17 09:49:02

timeout属性设置仅能缩短有限的时间,我常用的方法是在splash和主窗体运行前单独一个线程专门数据库连接
玻璃回忆

2024-10-17 10:05:45

adoconnection1.ConnectionTimeout = 0;
顺便说一下,首次连接因为需要初始化网络连接参数,因此较慢。
追问
别玩我了……试过0,无限遍历服务器……假死变真死
吧唧你一口

2024-10-17 12:08:16

procedure Tyhjm.FormCreate(Sender: TObject);
begin
try
begin with adoconnection1 do
begin
ConnectionString:=('xxx');
adoconnection1.loginprompt:=false;
connected:=true;
end;
end
except
adoconnection1.connected:=false;
adoconnection1.loginprompt:=false;
adoconnection1.timeout:=15;
application.MessageBox('服务器异常或程序需要更新','提示',64);
end;
if adoconnection1.connected=true then begin
statusbar1.Panels[0].Text:='服务器状态:正常';
end else begin
statusbar1.Panels[0].Text:='服务器状态:异常';
end;
end;
//sql服务器轮询时间:5S adoconnection1.commandtimeout:=1
adoconnection1.connectedtimeout:=1
加上这个代码就行adoconnection1.timeout:=15;