在项目中,会有一种场景:需要提前判断本地或远程数据库是否可以连接上。
直接进行判断:
private string _strConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["DispatchDB"].ToString();
public bool sqlConnectCheck()
{
bool connectFlag = false;
string connectionString = _strConnectionString;
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
connectFlag = true;
}
}
catch (Exception)
{
}
return connectFlag;
}
在运行时,发现这个方法在数据库无法连接时,会有很长时间的等待时间(30秒)。这和数据库的最大连接超时时间有关,可以在数据库连接字符串中添加一项来设置这个连接等待时间:
public bool sqlConnectCheck()
{
bool connectFlag = false;
string connectionString = _strConnectionString + ";Connect Timeout=3"; //增加设置连接最大等待超时时间
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
connectFlag = true;
}
}
catch (Exception)
{
}
return connectFlag;
}
有一种情况下,设置了等待超时时间还是会有很长时间等待,这是因为当SqlServer没有启动或者死机时,机器在等待TCP应答。在这种情况下设置等待超时时间不再管用,需要将连接验证放入后台线程中,使用时钟进行比较,超过时间则不再等待:
public bool sqlConnectCheck()
{
bool connectFlag = false;
string connectionString = _strConnectionString + ";Connect Timeout=3"; //增加设置连接最大等待超时时间
Stopwatch sw = new Stopwatch();
Thread t = new Thread(delegate ()
{
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
sw.Start();
connection.Open();
connectFlag = true;
}
}
catch (Exception)
{
}
});
t.IsBackground = true;
t.Start();
var timeout = TimeSpan.FromSeconds(3);
while (!connectFlag && sw.Elapsed < timeout)
t.Join(TimeSpan.FromMilliseconds(200));
sw.Stop();
return connectFlag;
}