我有一个Windows服务,它将数据更新到远程计算机中的数据库表。我想检查SQL服务器因任何原因停机并重新启动后服务是否正常(可能是SQL服务器软件重启或实际的Windows机器突然重启)。
我在10台服务器上安装了这个Windows服务。现在,当我重新启动开发sql server框时,所有10个框中运行的所有客户端服务程序都无法重新连接。但是,重新启动客户端Windows服务后,它工作正常。
我希望客户端程序在服务器可用后自动重新连接,并避免手动重新启动它们。
有什么建议吗?提前致谢。 下面是我用来连接sql server的代码。
private bool ConnectToSqlServer()
{
try
{
if (sqlConnection.State == ConnectionState.Closed)
{
sqlConnection.Open();
return true;
}
return false;
}
catch(Exception Ex)
{
eventLog1.WriteEntry("ConnectToSqlServer " + Ex.Message, EventLogEntryType.Error);
return false;
}
}
Windows 2008 Enterprise R2上的SQL Server - 2008。 客户端程序是C#,在visual studio 2010中开发,它使用.net框架工作4。
答案 0 :(得分:0)
我假设你只是尝试连接一次而且你得到了一个例外。如果你不是,那么以下将不起作用......
在您访问客户端数据库的任何位置添加SqlException Catch块。然后从该SqlException块调用重试连接每x秒进行y次迭代的逻辑。如下所示:
try
{
//Database access code here
}
catch(SqlException sexc)
{
if (!ReconnectToDatabase())
{
// log error to event log
}
}
private bool ReconnectToDatabase()
{
bool isConnected = false;
for (int i = 0; i < 5; i++) // 5 is arbitrary, use whatever retry count you want
{
if (ConnectToSqlServer())
{
break;
}
System.Threading.Thread.Sleep(5000); // 5 seconds is arbitrary
}
}
同样,此帖子的重试次数和等待时间是任意的。您需要考虑客户端等待的停机时间,以及SQL Server重启通常需要多长时间。
如果您正在尝试重新连接,那么在SqlException块中,调用SqlConnection.ClearAllPools()。
答案 1 :(得分:0)
您的ConnectionPool有一些陈旧的连接。尝试使用SqlConnection.ClearAllPools();
清除它们