2013-04-06 34 views
23

Tôi có một ứng dụng trong asp.net 3.5 và cơ sở dữ liệu là SQL Server 2005.thế nào để Solve Max Connection Pool Lỗi

"Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached." 

Một thời gian lỗi này xảy ra như thế nào để giải quyết lỗi này ..

tôi thử SqlConnection.ClearAllPools(); nhưng điều này cũng không hoạt động.

SqlCommand cmdToExecute = new SqlCommand(); 
      cmdToExecute.CommandText = "dbo.[sp_user_listing]"; 
      cmdToExecute.CommandType = CommandType.StoredProcedure; 
      DataTable toReturn = new DataTable("courier_user_listing"); 
      SqlDataAdapter adapter = new SqlDataAdapter(cmdToExecute); 

      // Use base class' connection object 
      cmdToExecute.Connection = sqMainConnection; 

      try 
      { 
       cmdToExecute.Parameters.Add(new SqlParameter("@suser_name", SqlDbType.VarChar, 250, ParameterDirection.Input, true, 0, 0, "", DataRowVersion.Proposed, _user_name)); 


       if (blnMainConnectionIsCreatedLocal) 
       { 
        // Open connection. 
        sqMainConnection.Open(); 
       } 
       else 
       { 
        if (CPMainConnectionProvider.IsTransactionPending) 
        { 
         cmdToExecute.Transaction = CPMainConnectionProvider.CurrentTransaction; 
        } 
       } 

       // Execute query. 
       adapter.Fill(toReturn); 
       i32ErrorCode = (Int32)cmdToExecute.Parameters["@iErrorCode"].Value; 

       if (i32ErrorCode != (int)LLBLError.AllOk) 
       { 
        // Throw error. 
        throw new Exception("Stored Procedure 'sp_courier_user_SelectAll' reported the ErrorCode: " + i32ErrorCode); 
       } 

       return toReturn; 
      } 
      catch (Exception ex) 
      { 
       // some error occured. Bubble it to caller and encapsulate Exception object 
       throw new Exception("Courier_user::SelectAll::Error occured.", ex); 
      } 
      finally 
      { 
       if (blnMainConnectionIsCreatedLocal) 
       { 
        // Close connection. 
        sqMainConnection.Close(); 
       } 
       cmdToExecute.Dispose(); 
       adapter.Dispose(); 
      } 
+0

"Hết thời gian chờ". - Tôi có thể nghĩ ra nhiều lý do tại sao một thời gian chờ sẽ xảy ra trước khi giả sử bạn đã đạt được kết nối tối đa .... –

+3

Hiển thị mã của chúng tôi –

+0

@MitchWheat - Đúng, chỉ có thông báo lỗi là rõ ràng về các kết nối tối đa bị trúng. – Oded

Trả lời

14

Kiểm tra mọi truy vấn chạy dài trong cơ sở dữ liệu của bạn.

Tăng kích thước hồ bơi của bạn sẽ chỉ làm cho webapp của bạn sống lâu hơn một chút (và có thể nhận được chậm hơn rất nhiều)

Bạn có thể sử dụng máy chủ profiler sql và lọc trên thời gian/đọc để xem querys cần tối ưu hóa.

Tôi cũng thấy bạn có thể đang giữ kết nối toàn cầu?

blnMainConnectionIsCreatedLocal 

Cho phép .net làm việc gộp nhóm cho bạn và mở/đóng kết nối bằng tuyên bố sử dụng.

Gợi ý:

  1. Luôn mở và gần một kết nối như thế này, vì vậy .net có thể quản lý kết nối của bạn và bạn sẽ không chạy ra khỏi các kết nối:

    using (SqlConnection conn = new SqlConnection(connectionString)) 
        { 
        conn.Open(); 
        // do some stuff 
        } //conn disposed 
    
  2. Như Tôi đã đề cập, kiểm tra truy vấn của bạn với profl server profiler và xem bạn có thể tối ưu hóa nó hay không. Việc có truy vấn chậm với nhiều yêu cầu trong một ứng dụng web cũng có thể gây ra những thời gian chờ này.

+0

xin cho tôi gợi ý những gì tôi làm .. –

+0

Tôi đã cập nhật câu trả lời của mình với một số đề xuất –

+2

Sự cố được giải quyết bằng cách tăng tối đa kích thước hồ bơi trong chuỗi kết nối Kích thước hồ bơi tối đa = 100 –

6

Có thể đây là vấn đề mở kết nối nhiều lần, bạn đang ở đâu đó trong kết nối mở mã và không đóng chúng đúng cách. sử dụng

using (SqlConnection con = new SqlConnection(connectionString)) 
     { 
      con.Open(); 
     } 

Tham khảo bài viết này: http://msdn.microsoft.com/en-us/library/ms254507(v=vs.80).aspx, Các Sử dụng khối trong Visual Basic hoặc C# tự động disposes của kết nối khi mã thoát khối, ngay cả trong trường hợp của một ngoại lệ unhandled.

5

Trước khi bạn bắt đầu nguyền rủa ứng dụng của bạn, bạn cần phải kiểm tra này:

  1. là ứng dụng của bạn là người duy nhất sử dụng mà thể hiện của SQL Server. a. Nếu câu trả lời cho điều đó là KHÔNG thì bạn cần phải điều tra cách các ứng dụng khác đang tiêu thụ tài nguyên trên Máy chủ SQl của bạn.run b. Nếu câu trả lời là có thì bạn phải điều tra đơn đăng ký của mình.

  2. Chạy SQL Server Profiler và kiểm tra xem hoạt động nào đang xảy ra trong các ứng dụng khác (1a) bằng SQL Server và kiểm tra ứng dụng của bạn (1b).

  3. Nếu thực sự ứng dụng của bạn bị thiếu tài nguyên thì bạn cần phải thực hiện điều tra xa hơn.Đối với đọc thêm về điều này http://sqlserverplanet.com/troubleshooting/sql-server-slowness

12

Đây là những gì u cũng có thể thử ....

chạy ứng dụng của bạn .... trong khi nó vẫn đang chạy khởi động lệnh của bạn nhanh chóng

trong khi ứng dụng của bạn đang chạy loại netstat -n trên lời nhắc lệnh. Bạn sẽ thấy danh sách các kết nối TCP/IP. Kiểm tra xem danh sách của bạn có dài không. Lý tưởng nhất là bạn nên có ít hơn 5 kết nối trong danh sách. Kiểm tra trạng thái của các kết nối.
Nếu bạn có quá nhiều kết nối với trạng thái TIME_WAIT nghĩa là kết nối đã bị đóng và đang chờ hệ điều hành giải phóng tài nguyên. Nếu bạn đang chạy trên Windows, cổng mặc định tạm thời reo là từ 1024 đến 5000 và thời gian mặc định cần Windows để giải phóng tài nguyên khỏi trạng thái TIME_WAIT là 4 phút. Vì vậy, nếu ứng dụng của bạn sử dụng nhiều hơn thì 3976 kết nối trong ít hơn 4 phút, bạn sẽ nhận được ngoại lệ bạn nhận được.

Gợi ý để sửa chữa nó:

  1. Thêm một hồ bơi kết nối với chuỗi kết nối của bạn.

Nếu bạn tiếp tục nhận được thông báo lỗi tương tự (mà là rất khó) thì bạn có thể thử như sau: (Xin đừng làm điều đó nếu bạn không quen thuộc với Windows registry)

  1. Chạy regedit từ lệnh chạy của bạn. Trong giao diện trình soạn thảo registry cho khóa registry này: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters:

Sửa đổi cài đặt để họ đọc:

MaxUserPort = dword: 00004e20 (10.000 chữ số thập phân) TcpTimedWaitDelay = dword: 0000001e (30 số thập phân)

Điều này sẽ tăng số lượng cổng lên 10.000 và giảm thời gian giải phóng kết nối tcp/ip được giải phóng.

Chỉ sử dụng đề xuất 2 nếu 1 không thành công.

Cảm ơn bạn.

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