打开SQL连接时出现访问被拒绝的错误

4
我们正在通过一个应用程序从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) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) at System.Data.SqlClient.SqlConnection.Open() at 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;
}

我想这与连接池有关。我们是否可以在打开并使用连接之前检查连接池中是否有可用连接?或者这是由于完全不同的原因引起的?
如果您需要更多信息,请随时询问。

可能是网络问题 - stuartd
可能出现以下问题之一:1- 服务器地址不正确。2- 服务器配置不正确,导致无法访问。3- 您没有连接到该服务器的权限。4- 服务器未正确配置以从远程连接进行访问。 - Youness
@Youness,错误是间歇性的 - stuartd
@stuartd 我正在检查。谢谢。你比我更快地回复了 :) - Craig Brett
我怀疑间歇性连接问题是不同问题的症状。在100多个并发查询中,包括长时间运行的查询,服务器可能过载而无法响应连接请求。SQL盒子使用什么样的硬件? - Dan Guzman
显示剩余3条评论
3个回答

3

我曾经也遇到过相同的问题。通过在SQL服务器配置管理器中启用NamePipes并关闭Windows防火墙或允许Windows防火墙中的sqlserver端口1433解决了该问题。希望这对您也有用。


抱歉回复晚了。如果这是问题的原因,为什么会是间歇性的呢?这不是每次都发生,只是有时候。 - Craig Brett
@CraigBrett,你最终解决了这个问题或者找到了它的原因吗? - Sturla
@Sturla:不,我想我们没有解决这个问题。我已经离开了我们使用该代码的公司,所以我不能确定,但我相当确定我们只是忍受了这个问题。 - Craig Brett
@CraigBrett 感谢回复。我们最终发现 SQL 机器有很多奇怪的事件错误。它处于一种奇怪的状态下,原因不明。当我们将数据库移动到另一台机器上时,问题得以解决。 - Sturla

2
如果有人需要解决此问题,可以按照以下步骤操作: 打开 Sql 配置 -> Sql Server 网络配置 -> MSSQLServer 的协议。 启用命名管道和 TCP/IP 设置。 通过 Windows 服务重新启动 MSSql 服务器。命名管道和 TCP/IP 设置

1
我曾经遇到过一个类似的问题。最终我们发现这不是SQL Server的问题,而是API服务器的问题。我们在API服务器上创建了数百甚至数千个线程,每个线程都会连接到数据库。API服务器无法处理负载,并开始抛出“访问被拒绝”的异常,甚至没有真正尝试连接。 解决方案是限制线程数量。我使用了这个答案中描述的模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接