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