我们通过一个应用程序在高吞吐量情况下从SQL中提取数据。任何时候都可能有多达100多个SQL请求。有些可能是长时间运行,这可能是他们加载的原因。
间歇性地(但不是经常),我们在致电SqlConnection.Open();
时收到以下异常:
System.Exception:从数据库获取文档时出错--->
System.Data.SqlClient.SqlException:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)---> System.ComponentModel.Win32Exception:访问被拒绝
---内部异常堆栈跟踪结束---at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,UInt32 waitForMultipleObjectsTimeout,Boolean allowCreate,Boolean onlyOneCheckConnection,DbConnectionOptions userOptions,DbConnectionInternal& connection)
在System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
1重试,DbConnectionOptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource
在System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource1 retry, DbConnectionOptions userOptions)
1重试)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource
在System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1重试)
在System.Data.SqlClient.SqlConnection.Open()
在BridgeService.SqlDal.GetDataFromSql(Int32 entityId)
---内部异常堆栈跟踪结束---
导致此异常的代码如下所示:
public DataSet GetDataFromSql(int entityId)
{
DataSet tempDataSet = null;
using (var cnn = new SqlConnection(GetConnectionString()))
{
cnn.Open(); // this line throws the exception
try
{
// stuff gets done on cnn
}
catch (Exception e)
{
throw e;
}
}
return tempDataSet;
}
我想象这是以某种方式与连接池有关。有没有办法在我们打开并使用它之前检查池中的可用连接?或者这是由完全不同的东西引起的?
如果您需要更多信息,请随时提出。
答案 0 :(得分:1)
我曾经遇到同样的问题。通过在SQL Server配置管理器中启用NamePipes并关闭Windows防火墙或在Windows防火墙中允许sqlserver端口1433来解决 希望它对你也有用
答案 1 :(得分:0)
我遇到了similar problem。最终我们发现它根本不是SQL Server的问题;这是API服务器上的一个问题,我们在这里开辟了数百甚至数千个线程,每个线程都与数据库建立了自己的连接。 API服务器无法处理负载并开始抛出" Access Denied"甚至没有真正尝试连接的例外。
Solution是为了限制线程的数量。我使用了this answer中描述的模式。
答案 2 :(得分:0)