我已经想出了以下方法来确定数据库是否正常运行。这会尝试打开数据库连接,如果失败,则返回false。
private static bool IsDatabaseConnectionUp(string connectionString)
{
System.Data.SqlClient.SqlConnection conn = null;
try
{
conn = new SqlConnection(connectionString);
conn.Open();
return conn.State == System.Data.ConnectionState.Open;
}
catch (SqlException)
{
// There was an error in opening the database so it is must not up.
return false;
}
finally
{
if (conn != null)
{
if (conn.State == System.Data.ConnectionState.Open)
{
conn.Close();
}
conn.Dispose();
}
}
}
这是确定此数据库是否已启动的最佳方法吗?我不喜欢这种方法的原因是它将依赖于超时值,并且只要设置超时就会占用。
有更好的方法吗?
答案 0 :(得分:2)
这实际上取决于您要确定的内容。如果您真的想确定“服务器是否正在运行,并且能够被访问”,那么我会说这很可能是最有效的方式。我这说的原因是服务器本身可能已启动,但它可能不接受连接,或者应用程序正在使用的连接可能无效(用户名/密码不正确)。
因此,鉴于此,超时是必需的,因为您要验证真正的连接。如果您只想查看服务器是否在那里,您可以尝试ping,但这只是告诉您设备是否处于活动状态,不一定是SQL Server完全启动并运行且可用。
答案 1 :(得分:2)
由于您专门查看SQLServer连接,请将连接字符串转换为SqlConnectionStringBuilder对象并更改超时值。
SqlConnectionStringBuilder csb =
new SqlConnectionStringBuilder(connectionString);
csb.ConnectTimeout = 5;
string newConnectionString = csb.ToString();
这样可以控制超时值。请记住,不要将它设置得太低或者你会得到误报。
答案 2 :(得分:1)
你的模式很接近但是有一个问题。因为SQLConnection实现了IDisposable,所以在返回之前你真的应该处理你的测试连接。
try
{
using (System.Data.SqlClient.SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
return conn.State == System.Data.ConnectionState.Open;
}
}
catch (SqlException)
{
// There was an error in opening the database so it is must not up.
return false;
}
关于其他海报所说的内容,如果您只想查看数据库实例是否正在运行,您可以枚举系统上的进程,或使用命令行访问来测试数据库,但要么这些选项完全取决于数据库供应商。对于大多数应用程序,您的方法通常都可以。
答案 3 :(得分:0)
如果您对该特定数据库(不是整个数据库服务器)的状态感兴趣,那么是的,这将是最好的方式。
答案 4 :(得分:0)
如果您担心超时,可以尝试一些事情......
您可以尝试ping服务器。除非不允许使用ICMP数据包,否则会更快地告诉您服务器是否已关闭。如果无法ping通,则无法连接。显然,不能保证你可以连接,但是当你不能连接时它会更快。
您可以使用不同的连接字符串进行服务器连接测试。您通常不需要完整的默认时间来建立连接,因此您可能会大幅降低它。
如果您可以允许稍微陈旧的数据,您可以拥有一个服务,每X分钟(5或10或其他)检查连接,然后询问该服务以获取最新信息。这更像是Witness的行为。
答案 5 :(得分:0)
这可能是一个简化的代码段,但你不应该有conn.Dispose()或using(...){...}语句吗?
编辑:没关系,我看到了评论。