ADO.NET:更快速地检查数据库服务器是否可访问?

目前我正在使用此代码检查数据库是否可访问:

public bool IsDatabaseOnline(string con) { bool isConnected = false; SQLConnection connect = null; try { connect = new SQLConnection(con); connect.Open(); isConnected = true; } catch (Exception e) { isConnected = false; } finally { if (connect != null) connect.Close(); } return isConnected; } 

虽然这段代码工作得很好,但是有一个缺点。 如果服务器不在线,它会花费大约4整秒的时间尝试打开连接,然后再决定它不可用。

有没有办法测试连接而不试图实际打开它并等待超时? 像数据库相当于ping的东西?

您可以将连接超时更改为更短。 做一些测试,看看你能走多远,仍然可靠。 我打赌你可以接近500毫秒。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

我的方法(成功连接后)是做一个不依赖于表的选择,例如时间。 在MS SQL Server中:

“选择Sysdatetime()”

是的,不是。

您可以随时记下服务器侦听的端口,然后尝试使用套接字直接连接到该端口。 然后,如果您成功,您可以“假设”它在线,但它可能不依赖于您的网络环境。 这是最“平”的方法。 当然,可能还有其他东西在那里听,但在DB暂时暂停的标准环境中,这可能不太可能。

此外,如果您的数据库在专用计算机上,您实际上可以ping它。 但这只会检查机器是否启动,而不是数据库服务器。

最后一个选项是让一些后台服务器不断监视数据库服务器,当检测到它处于脱机状态时,它会正确标记一些内容。 然后你的应用程序会检查那个东西(实际上是一个缓存),它几乎是即时的。 当然,这意味着它可能会给出假阴性(即服务器可能在线,但监控服务尚未更新缓存)。