代码之家  ›  专栏  ›  技术社区  ›  the_joric

为什么SqlConnection.Open()中会发生超时?

  •  7
  • the_joric  · 技术社区  · 15 年前

    SqlConnection.Open()中发生超时的情况是什么?

    在AppProcess被回收10秒后,在我们的一个IIS框上出现以下异常:

    Type : System.Data.SqlClient.SqlException, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
        Message : Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
        Source : .Net SqlClient Data Provider
        Help link : 
        Errors : System.Data.SqlClient.SqlErrorCollection
        Class : 11
        LineNumber : 0
        Number : -2
        Procedure : 
        Server : XXX
        State : 0
        ErrorCode : -2146232060
        Data : System.Collections.ListDictionaryInternal
        TargetSite : Void OnError(System.Data.SqlClient.SqlException, Boolean)
        Stack Trace :    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
           at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
           at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
           at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
           at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
           at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean& marsCapable)
           at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnection owningObject)
           at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
           at System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(Boolean useFailoverHost, String primaryHost, String failoverHost, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
           at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
           at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
           at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
           at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
           at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
           at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
           at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
           at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
           at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
           at System.Data.SqlClient.SqlConnection.Open()
           at NHibernate.Connection.DriverConnectionProvider.GetConnection()
           at NHibernate.Impl.SessionFactoryImpl.OpenConnection()
    

    根据 MSDN 数字 属性包含SQL引擎错误。但是我在master.dbo.sysmessages中找不到错误-2。

    2秒钟后,相同的线程出现了类似的异常,但出现在不同的位置。调用堆栈要短得多:

        Type : System.Data.SqlClient.SqlException, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
    Message : Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
    Source : .Net SqlClient Data Provider
    Help link : 
    Errors : System.Data.SqlClient.SqlErrorCollection
    Class : 11
    LineNumber : 0
    Number : -2
    Procedure : 
    Server : XXX
    State : 0
    ErrorCode : -2146232060
    Data : System.Collections.ListDictionaryInternal
    TargetSite : Void OnError(System.Data.SqlClient.SqlException, Boolean)
    Stack Trace :    at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       at System.Data.SqlClient.SqlConnection.Open()
       at NHibernate.Connection.DriverConnectionProvider.GetConnection()
       at NHibernate.Impl.SessionFactoryImpl.OpenConnection()
    

    尝试与数据库通信的操作与错误之间的间隔小于秒。

    问题: 1.如何再现这些错误?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Community CDub    8 年前

    问题似乎是镜像造成的。描述了同样的情况 here

        2
  •  1
  •   hakan    15 年前

    中的一些超时情况 SqlConnection.Open() 指连接泄漏。当连接池没有连接时,可能会发生这种情况。首先,您应该检查IIS机器的回收连接数计数器。它应该是0。如果不是,则应检查代码以确保sql连接已正确关闭。

        3
  •  0
  •   Serkan Hekimoglu    15 年前

    可能有一些原因,例如SQL server无法处理作业。。 通常情况下,托管SQL server的服务器的Ram-CPU进程会上升,并且您的SQL无法响应您的调用。增加超时时间,然后再等待(如果确定,连接设置都正确)。