重新启动Sql Server后,c# Windows服务Sql客户端无法连接数据库
本文关键字:Sql 客户端 连接 数据库 服务 Windows Server 重新启动 | 更新日期: 2023-09-27 18:06:23
我有一个windows服务,它将数据更新到远程机器中的数据库表中。我想检查一下,如果服务工作正常后,SQL服务器下降和重启的任何原因(它可能是SQL服务器软件重启或实际的windows机器突然重启)。
我在10台服务器上安装了这个windows服务。现在,当我重新启动开发sql server机器时,在所有10个机器中运行的所有客户端服务程序都无法重新连接。但是,在我重新启动客户端窗口服务后,它可以正常工作。
我希望客户端程序在服务器可用时自动重新连接,避免手动重新启动它们。
有什么建议吗?提前感谢。下面是我用来连接到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;
}
}
SQL Server - 2008在Windows 2008 Enterprise R2上。客户端程序是c#,在visual studio 2010中开发,使用。net framework framework。
我假设你只尝试连接一次,你得到一个异常。如果你不是,那么下面的代码将不起作用…
在客户端访问数据库的任何地方添加一个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()。
您的ConnectionPool有一些陈旧的连接。尝试使用SqlConnection.ClearAllPools();