2010-06-29 23 views
7

Những trường hợp nào xảy ra khi hết thời gian chờ trong SqlConnection.Open()?Tại sao thời gian chờ có thể xảy ra trong SqlConnection.Open()?

Trên một hộp IIS của chúng tôi 10 giây sau khi AppProcess được tái chế các ngoại lệ sau đây xuất hiện:

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() 

Theo MSDNSố tài sản chứa Lỗi SQL Engine. Nhưng tôi đã không thể tìm thấy lỗi -2 trong master.dbo.sysmessages. Khoảng thời gian giữa thao tác cố mở kết nối khoảng 3,5 giây. Thời gian chờ kết nối không được thay đổi rõ ràng.

Sau 2 giây ngoại lệ tương tự xuất hiện cho cùng một chuỗi nhưng ở vị trí khác. Ngăn xếp cuộc gọi ngắn hơn nhiều:

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() 

Khoảng thời gian giữa thao tác cố gắng liên lạc với DB và lỗi nhỏ hơn giây.

Câu hỏi: 1. Cách tạo lại lỗi như vậy? 2. Tại sao ngăn xếp cuộc gọi ngắn hơn trong trường hợp thứ hai?

Trả lời

2

Dường như vấn đề là do phản ánh. Tình huống tương tự được mô tả here

0

Có thể có một số lý do như máy chủ SQL của bạn không thể xử lý công việc của bạn .. Nói chung máy chủ đang lưu trữ SQL Server, Ram - CPU Process sẽ xuất hiện và không thể trả lời cuộc gọi của bạn. tăng thời lượng chờ của bạn và chờ nhiều hơn (Nếu bạn chắc chắn, cài đặt kết nối của bạn là chính xác).

+0

Serkan - khoảng cách giữa cuộc gọi phương thức và lỗi ít hơn thời gian chờ kết nối thông thường (15 giây). Trong trường hợp khác nó xảy ra gần như ngay lập tức. –

+0

Vì vậy, có vẻ như không có sự cố kết nối. Tôi có một câu hỏi. Sql của bạn đang chạy trên máy chủ cục bộ hoặc trên máy chủ? Nó chạy trên máy chủ, kiểm tra Nhật ký sự kiện của máy chủ. Có bất kỳ đăng nhập về mạng hoặc Sql? –

+0

Máy chủ SQL ở xa nhưng chúng tôi không có quyền truy cập vào nó. Tôi đặt một yêu cầu cho DBA. Chỉ cần tự hỏi điều gì có thể gây ra vấn đề. –

1

Một số trường hợp hết thời gian chờ trong SqlConnection.Open() đề cập đến rò rỉ kết nối. Nó có thể xảy ra khi nhóm kết nối không có kết nối. Trước tiên, bạn nên kiểm tra số lượng truy cập các kết nối truy cập của máy IIS. Nó sẽ là 0. Nếu không, bạn nên kiểm tra mã của bạn để đảm bảo rằng các kết nối sql được đóng đúng cách.

+0

hakan, trong trường hợp đó sẽ có loại ngoại lệ khác nhau, mặc dù văn bản sẽ gần như giống nhau: System.InvalidOperationException: Hết thời gian chờ. Khoảng thời gian chờ đã trôi qua trước khi có kết nối từ hồ bơi. Điều này có thể xảy ra vì tất cả các kết nối được gộp lại đã được sử dụng và đạt đến kích thước hồ bơi tối đa. –

Các vấn đề liên quan