有没有办法检查数据库连接是否打开?我正在尝试检查 connectionState,但即使数据库已关闭,它也会将 ConnectionState 显示为打开。
private bool IsValidConnection(IDbConnection connection)
{
return (connection != null && connection.State == ConnectionState.Open);
}
有没有办法检查数据库连接是否打开?我正在尝试检查 connectionState,但即使数据库已关闭,它也会将 ConnectionState 显示为打开。
private bool IsValidConnection(IDbConnection connection)
{
return (connection != null && connection.State == ConnectionState.Open);
}
虽然我没有答案,但我可以告诉你为什么会发生这样的事情它基本上发生在 TCP 之上的任何不发送周期性心跳的协议上。
TCP 没有提供任何方法来检测远程端是否关闭,而不发送任何数据,即使这样,检测远程端的故障也可能需要相当长的时间。
在理想情况下,服务器在宕机时会发送一个 TCP FIN 数据包,但如果有人拔出网线、服务器严重崩溃或中间的 NAT 网关/防火墙静默断开连接,则不会发生这种情况。这会导致客户端不知道服务器已消失,您必须向它发送一些东西并假设服务器已消失您在合理的时间内没有收到响应,或者发生错误(通常是前几个发送() 在服务器静默消失后调用不会出错)。
因此,如果您想确保 DB Conenction 正常,请发出select 1
;` 查询。一些较低级别的 DB API 可能具有可用于相同目的的 ping()/isAlive() 或类似方法。
这看起来像是检查您的数据库连接是否仍然打开的正确代码。
当数据库关闭时,我希望在您的 connection.Open() 上看到一个异常。数据库是在您打开连接之前关闭还是在打开后关闭?
一种简单的方法是编写一个带有查询的按钮,从数据库的某个表中检索一些数据,如果返回错误则捕获它。
这将显示是否存在连接。