重新启动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()。

重新启动Sql Server后,c# Windows服务Sql客户端无法连接数据库

您的ConnectionPool有一些陈旧的连接。尝试使用SqlConnection.ClearAllPools();

相关文章: