Azure应用服务定期失去与Azure虚拟网络上的本地SQL数据库的连接,直到应用重新启动

tcomlyy6  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(108)

我们在Azure上托管了一个Web应用程序,应用程序服务在网络选项卡中连接了一个虚拟网络,禁用了路由所有数据。虚拟网络网关通过站点到站点连接连接到本地网络网关,连接工作正常,我们可以通过Web应用程序查询本地数据库。

到本地数据库的连接字符串:

Data Source=192.168.xxx.xxx\\Name;Initial Catalog=DBName;Persist Security Info=False;User ID=User;Password=Password;Trusted_Connection=False;Connection Timeout=120;

查询示例代码:

using (var dbConnection = new SqlConnection(AppSettings.DBConnection))
{
    try
    {
        if (dbConnection.State != ConnectionState.Open)
            await dbConnection.OpenAsync();

        string query = "SELECT * FROM dbo.table";

        using (var sqlDataAdapter = new SqlDataAdapter(query, dbConnection))
        {
            DataTable dt = new DataTable();
            sqlDataAdapter.Fill(dt);
            // Custom retrieval from dt
            details.itemDetails = DBHelper.GetListOfObjects<ItemDetail>(dt);
            details.otherDetails = DBHelper.GetListOfObjects<OtherDetail>(dt);
        }
    }
    catch (Exception e)
    {
        throw new Exception($"Could not fetch Item Details{Environment.NewLine}{e.Message}");
    }
}

几天后,我们收到内部数据库

的连接错误
修复连接的唯一方法是重新启动Azure App Service。我仍然能够从应用服务Kudu控制台查询数据库,但是应用服务在重新启动之前会出现此错误。我想它暂时失去连接,然后无法重新连接。
本地网络网关存在于美国中北部服务器上,而虚拟网络网关存在于美国西部服务器上,这是否是虚拟网络中断开连接的问题?

mrfwxfqh

mrfwxfqh1#

云端的网络不可靠。必须为瞬时故障实现重试逻辑的原因。下面是一个使用Polly的示例:

using Polly;

...

// Define the policy for handling transient faults
var retryPolicy = Policy
    .Handle<SqlException>()
    .Or<TimeoutException>()
    .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

using (var dbConnection = new SqlConnection(AppSettings.DBConnection))
{
    await retryPolicy.ExecuteAsync(async () =>
    {
        try
        {
            if (dbConnection.State != ConnectionState.Open)
                await dbConnection.OpenAsync();

            string query = "SELECT * FROM dbo.table";

            using (var sqlDataAdapter = new SqlDataAdapter(query, dbConnection))
            {
                DataTable dt = new DataTable();
                sqlDataAdapter.Fill(dt);
                // Custom retrieval from dt
                details.itemDetails = DBHelper.GetListOfObjects<ItemDetail>(dt);
                details.otherDetails = DBHelper.GetListOfObjects<OtherDetail>(dt);
            }
        }
        catch (Exception e)
        {
            throw new Exception($"Could not fetch Item Details{Environment.NewLine}{e.Message}");
        }
    });
}

更多信息:
https://github.com/App-vNext/Polly

相关问题