Nhóm kết nối tối đa giới hạn ở mức 100


27

Tôi đang chạy SQL Server 2008 R2 SP1, trên hộp Windows Server 2008. Tôi có một tập lệnh .NET chạy từ Visual Studio 2010, thực hiện như sau:

  • Tiếp cận cơ sở dữ liệu
  • Tạo sự thay đổi
  • Lặp đi lặp lại

Tổng số lần nó sẽ lặp lại là 150, tuy nhiên nó dừng ở 100 kết nối và tôi không thể hiểu tại sao. Tôi có thể điều chỉnh tập lệnh của mình để chỉ sử dụng một luồng duy nhất, nhưng tôi muốn biết nơi tôi thiếu cài đặt kết nối tối đa vì điều đó sẽ hữu ích hơn để biết để tham khảo trong tương lai.

Đây là nơi tôi đã kiểm tra cho đến nay:

  • Chuỗi kết nối SQL trong Visual Studio 2010 (được đặt thành 1000)
  • Thuộc tính kết nối đối tượng cơ sở dữ liệu SSMS (được đặt thành 0 [vô cực] kết nối người dùng)
  • Đã thu thập một số thông tin trên Server 2008, có vẻ như nó có thể xử lý hơn 100 kết nối
  • Bước qua mã của tôi cùng với SP_WHO2đó cung cấp thêm thông tin về các kết nối logic, thấy rằng # của các kết nối bắt đầu ở mức 52 và các lỗi tập lệnh với lỗi "Đạt kết nối tối đa đạt được" ở 152 kết nối logic.
  • Đã thay đổi chuỗi kết nối để sử dụng Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

Tôi không chắc chắn nơi nào khác để kiểm tra, tôi biết tôi có rất nhiều bộ phận chuyển động ở đây nhưng tôi có cảm giác tôi chỉ thiếu một thiết lập bể bơi tối đa ở đâu đó.


1
Bạn có thể gửi chuỗi kết nối của bạn? Xin vui lòng xem câu trả lời của tôi. Đó phải là biện pháp khắc phục của bạn (giá trị này sẽ được chỉ định trong chuỗi kết nối. Mặc System.Data.SqlClientđịnh là 100, đó là lý do tại sao bạn thấy cạn kiệt nhóm kết nối).
Thomas Stringer

Câu trả lời:


24

SQL Server cho phép tối đa 32767 kết nối theo mặc định. Nó có thể được thay đổi bằng cách sử dụng sp_configure. Để xem cấu hình hiện tại của bạn cho cài đặt này, hãy sử dụng truy vấn sau:

select * from sys.configurations
where name ='user connections'

Theo mặc định, bạn sẽ thấy tối đa 32767, value_in_usebằng 0 (sử dụng cài đặt mặc định). Nếu điều này đã được thay đổi, bạn có thể cấu hình lại SQL Server để sử dụng các giá trị khác như được mô tả trong liên kết.

Bạn cũng nên xem lại có bao nhiêu kết nối đang thực sự được tạo ra, vì có thể có nhiều hoạt động bên ngoài ứng dụng của bạn (hoặc ứng dụng của bạn đang tạo ra nhiều kết nối hơn bạn nghĩ). Bạn sẽ muốn xem Thống kê chung -> Kết nối hợp lý trong perfmon hoặc truy vấn các giá trị trong sys.dm_os_performance_counters(cntr_value sẽ hiển thị điểm hiện tại theo giá trị thời gian):

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'

Đúng, tôi đã kiểm tra các kết nối người dùng (đó là điều đầu tiên tôi tìm đến và là cách dễ nhất để tìm thấy cả trong giao diện người dùng và tài liệu của Microsoft. Tôi cũng đã xem qua mã của mình và theo dõi số lượng kết nối hợp lý qua SSMS sử dụng SP_WHO2, cung cấp một lượng thông tin dồi dào về các kết nối logic. Idling, máy chủ của tôi có 51 kết nối. Khi tập lệnh thất bại, nó đã tạo thêm 100 kết nối. Đó là cách tôi đã đến nơi tôi đang ở hiện tại.
Sean Long

Tôi đã làm rõ câu hỏi của mình hơn một chút với các bước tôi đã thực hiện. Nó có thể không phải là một thiết lập trong SQL, đó là lý do tại sao tôi bắt đầu xem xét các cài đặt Windows và Visual Studio.
Sean Long

1
Nếu bạn đã kiểm tra tất cả những điều đó và nó vẫn thất bại ở 100 kết nối, câu trả lời nằm ngoài cài đặt cơ sở dữ liệu. FYI, 51 kết nối đó là tất cả các quy trình hệ thống (+1 cho chính bạn).
Mike Fal

Chỉ cần cung cấp một số đóng cửa, nhận xét cuối cùng đã kết thúc là chính xác. Tôi đã xem xét kỹ hơn tại sao 100 kết nối đó được tạo ra và tìm thấy một rò rỉ trong mã. Sau khi sửa nó hoạt động tốt. Các thông tin trên vẫn hoàn toàn hữu ích và tôi hy vọng những người khác cũng sẽ thấy nó hữu ích.
Sean Long

25

Trong chuỗi kết nối của bạn, chỉ định max pool size=<your desired max pool size>. Vì vậy, nói cách khác, nếu bạn muốn thay đổi kích thước nhóm tối đa thành giá trị 500, chuỗi kết nối của bạn có thể giống với điều này:

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

Rõ ràng tôi đang giả định rất nhiều với các thông số khác của bạn, nhưng điều này sẽ cho bạn ý tưởng tốt về cách tiến hành. Kết nối tổng hợp là thực thi nhà cung cấp phía khách hàng. Đó là ứng dụng khách sẽ cần chỉ định cài đặt kích thước nhóm tối đa này, thông qua chuỗi kết nối.

Ngoài ra, hãy chắc chắn rằng bạn đang đóng hoặc xử lý các kết nối của mình đúng cách, nếu không bạn sẽ buộc các kết nối. Một cái gì đó như thế này (C #):

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

Các usingkhối (trong C #) gọi IDisposable.Dispose()sau khi hoàn thành. Bạn cũng có thể thực hiện SqlConnection.Dispose()hoặc SqlConnection.Close()trong finallykhối của một try/catch/finallykhối.

Tham khảo: Tài liệu MSDN trên thuộc tính SqlConnection.ConnectionString


Đây là chuỗi kết nối, cập nhật câu hỏi của tôi quá. Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Sean Long

3
Đó có phải là chuỗi kết nối của bạn ở khắp mọi nơi ? Lý do tôi hỏi, là bởi vì các chuỗi kết nối khác nhau sẽ là các nhóm kết nối khác nhau.
Thomas Stringer

Đó là một câu hỏi rất, rất tốt. Tôi đã kiểm tra 3 chuỗi kết nối cho đến nay, nhưng tất cả chúng đều đang đẩy cho một nhóm tối đa cao. Tôi sẽ xem liệu tôi có thể tìm thấy bất kỳ chuỗi nào khác có thể gây ra nó không.
Sean Long

Nếu bạn chỉ gỡ lỗi thực thi, bạn sẽ có thể xem giá trị thời gian chạy của SqlConnection.ConnectionStringhoạt động cụ thể là gì. Đó là cách dễ nhất. Nếu max pool sizekhông có thì 100 rồi.
Thomas Stringer

1
Điều này nên được đánh dấu là câu trả lời được chấp nhận vì nó thực sự trả lời OP chính xác. Anh ta đề cập đến cả tham số Max Pool Size của chuỗi khách hàng và nhu cầu đóng / loại bỏ các kết nối.
Adam Caviness
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.