打开SQL连接时拒绝访问

时间:2014-10-06 10:13:14

标签: c# sql-server ado.net

我们通过一个应用程序在高吞吐量情况下从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,TaskCompletionSource 1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource
1重试,DbConnectionOptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal& connection)
  在System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource 1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource
1重试)
  在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;
}

我想象这是以某种方式与连接池有关。有没有办法在我们打开并使用它之前检查池中的可用连接?或者这是由完全不同的东西引起的?

如果您需要更多信息,请随时提出。

3 个答案:

答案 0 :(得分:1)

我曾经遇到同样的问题。通过在SQL Server配置管理器中启用NamePipes并关闭Windows防火墙或在Windows防火墙中允许sqlserver端口1433来解决 希望它对你也有用

答案 1 :(得分:0)

我遇到了similar problem。最终我们发现它根本不是SQL Server的问题;这是API服务器上的一个问题,我们在这里开辟了数百甚至数千个线程,每个线程都与数据库建立了自己的连接。 API服务器无法处理负载并开始抛出" Access Denied"甚至没有真正尝试连接的例外。

Solution是为了限制线程的数量。我使用了this answer中描述的模式。

答案 2 :(得分:0)

这已经过时了,但是如果有人需要解决方案,

打开Sql配置> Sql Server网络配置> MSSQLServer的协议 然后启用命名管道和TCP / IP设置。

通过Windows服务重新启动MSSql Server。 Named Pipes and TCP/IP settings