经典的判断数据库连接断开或网络断开问题

我们这里的软件遇到这个问题,解决的办法是,每次用数据库的时候都把connection和query打开一次,同时在界面上留有panel来提示网络断开还是数据库断开(下面两个函数是我们用来判断网络断开还是数据库断开的函数): 
function CheckNetConnection(IP: string): Boolean; 
var 
Echo: TIdEcho; 
begin 
Echo := TIdEcho.Create(nil); 
with Echo do 
begin 
try 
Host := IP; 
Connect(1000); 
Result := True; 
except 
Result := False; 
end; 
end; 
Echo.Free; 
end; 

function CheckDBConnection(IP: string): Boolean; 
var 
Telnet: TIdTelnet; 
begin 
Telnet := TIdTelnet.Create(nil); 
try 
with Telnet do 
begin 
if Connected then Disconnect; 
Host := IP; 
Port := 1433;//数据库服务用的端口号(Sql server使用这个端口号) 
try 
Connect(1000); 
Result := True; 
except //否则重连 
Result := False; 
end; 
end; 
finally 
Telnet.Disconnect; 
Telnet.Free; 
end; 
end;

上面两个函数在Timer中周期性检查,我们的timer时间间隔为10秒,显示稍微之后,不过客户能够容忍,另外断开网络的时候检索数据库还是偶尔卡一点,不过无需重起软件,只要处理网络和数据库就行了

每次有人找我问起楼主那个经典问题,我都是同样的回答.. 
可几乎每次问问题的人总以为我在开玩笑. 

当数据库连接断开时,这时候需要做什么呢?是试图重连?不断检查连接状态? 
NO! 不要这样做! 
数据库为什么断开?多半网络问题或者数据库当机或重启.事实上,这时候试图程序自动重连, 
毫无意义!这样做反而会为负担很重的网络更没有恢复的机会. 

这时候该做什么? 是的,释放连接对象,很多封装底层连接的组件,都会暂存连接状态, 
当底层实际连接失败,封装对象的状态却是连接正常,这时候,连接不可能得到恢复. 
怎么让封装对象与底层连接状态一致? 很简单,让连接对象CLOSE! 

怎么知道连接失败? 在对数据库操作时! 对于VCL,组件会扔出数据库类型的异常,要做的,就是抓住它.对于使用数据感知控件,在Application.OnException事件中也可以得到它. 
在处理这样异常时,就按刚才说的那样,"让连接对象CLOSE"! 

对于状态为CLOSE的连接对象,不需要再操心什么.在使用VCL封装Ado时,当连接对象AdoConnection状态为关闭时,任何一个数据库的操作,它都会自动去连接.这是缺省的属性设计. 

同意楼上,也许我们考虑的楼上的意见以后可以解决我们软件仅有的一顿的问题,那样提示\重连\而且还不顿,就比较好了

TDataForm = class(TDataModule) 
//... 
procedure DataModuleCreate(Sender: TObject); 
private 
FOldApplicationOnException : TExceptionEvent; 
procedure HandleException(Sender: TObject; E: Exception); 
... 
end. 

procedure TDataForm.DataModuleCreate(Sender: TObject); 
begin 
... 
FOldApplicationOnException := Application.OnException; 
Application.OnException := HandleException; 
end; 

procedure TDataForm.HandleException(Sender: TObject; E: Exception); 
begin 
if E.ClassNameIs('EOleException') then 
if ShowMsg(Screen.ActiveForm, format( 
'数据库连接被意外中止,要重新连接吗?'#10#13+ 
'错误原因:%s', 
[E.Message])) = IDYES then 
begin 
MainConn.Connected := False; 
MainConn.Connected := True; 
Exit; 
end; 
if Assigned(FOldApplicationOnException) then 
FOldApplicationOnException(Sender, E) 
end;

mark

我也遇到了类似的问题, 大家有时间看看 
http://community.csdn.net/Expert/topic/5460/5460676.xml?temp=7.497805E-02

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断数据库是否连接,你可以使用步骤: 1. 导入所需的数据库连接库,例如 JDBC。 2. 创建数据库连接对象,并指定数据库连接参数,如数据库的URL、用户名和密码。 3. 使用连接对象的方法,如 `getConnection()`,尝试建立与数据库连接。 4. 检查连接对象的状态,如 `isValid()` 方法,以判断连接是否有效。 5. 根据连接的状态,进行相应的处理。如果连接有效,则表示数据库连接;否则,表示数据库连接连接断开。 下面是一个使用 Java 语言的示例代码: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DatabaseConnection { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "password"; try { // 创建数据库连接 Connection connection = DriverManager.getConnection(url, username, password); // 检查连接状态 boolean isConnected = connection.isValid(5); // 根据连接状态进行处理 if (isConnected) { System.out.println("数据库连接"); } else { System.out.println("数据库连接"); } // 关闭数据库连接 connection.close(); } catch (SQLException e) { System.out.println("数据库连接异常:" + e.getMessage()); } } } ``` 在上述示例中,我们尝试创建一个与名为 "mydatabase" 的 MySQL 数据库连接。如果连接成功,则打印 "数据库连接";否则,打印 "数据库连接"。请确保替换示例中的数据库URL、用户名和密码为你自己的数据库信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值