gpt4 book ai didi

c# - 处理数据库连接问题的正确方法

转载 作者:可可西里 更新时间:2023-11-01 08:08:40 33 4
gpt4 key购买 nike

我在尝试连接数据库时遇到以下错误:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

现在有时我会得到这个错误,有时我不会这样,例如:当我第一次运行我的程序时,它成功打开连接,当我第二次运行时我得到这个错误,下一刻我运行再次我的程序然后我没有得到错误。

当我尝试通过 SSMS 连接到同一数据库服务器时,我能够成功连接,但我只在我的程序中遇到了这个网络问题。

数据库不在我的LOCAL中。它在AZURE中。

我的本​​地数据库没有出现此错误。

代码:

public class AddOperation
{
public void Start()
{
using (var processor = new MyProcessor())
{
for (int i = 0; i < 2; i++)
{
if(i==0)
{
var connection = new SqlConnection("Connection string 1");
processor.Process(connection);
}
else
{
var connection = new SqlConnection("Connection string 2");
processor.Process(connection);
}
}
}
}
}

public class MyProcessor : IDisposable
{
public void Process(DbConnection cn)
{
using (var cmd = cn.CreateCommand())
{
cmd.CommandText = "query";
cmd.CommandTimeout = 1800;
cn.Open();//Sometimes work sometimes dont
using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
//code
}
}
}
}

所以我对两件事感到困惑:

1) ConnectionTimeout:我是否应该增加连接超时,这会解决我的异常连接问题吗?

2) 重试策略:我应该像下面这样实现重试连接机制吗:

public static void OpenConnection(DbConnection cn, int maxAttempts = 1)
{
int attempts = 0;
while (true)
{
try
{
cn.Open();
return;
}
catch
{
attempts++;
if (attempts >= maxAttempts) throw;
}
}
}

我对以上两个选项感到困惑。

有人可以建议我什么是处理这个问题的更好方法吗?

最佳答案

使用新版本的 .NET(4.6.1 或更高版本),然后利用内置的弹性功能:

ConnectRetryCount、ConnectRetryInterval 和连接超时。

有关详细信息,请参阅:https://learn.microsoft.com/en-us/azure/sql-database/sql-database-connectivity-issues#net-sqlconnection-parameters-for-connection-retry

关于c# - 处理数据库连接问题的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49570306/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com