8

Chúng tôi có một dịch vụ web được mã hóa bằng C#, thực hiện nhiều cuộc gọi đến cơ sở dữ liệu MS SQL Server 2005. Mã sử ​​dụng Sử dụng các khối kết hợp với kết nối tổng hợp của C#.Tại sao có quá nhiều kết nối sp_resetconnings cho kết nối gộp C#?

Trong khi theo dõi SQL, chúng tôi đã thấy nhiều, nhiều cuộc gọi đến "sp_resetconnection". Hầu hết trong số này ngắn < 0,5 giây, tuy nhiên đôi khi chúng tôi nhận được cuộc gọi kéo dài tới 9 giây.

Từ những gì tôi đã đọc sp_resetconnection liên quan đến kết nối tổng hợp và cơ bản đặt lại trạng thái của kết nối mở. Câu hỏi của tôi:

  • Tại sao kết nối mở cần thiết lập lại trạng thái của nó?
  • Tại sao có quá nhiều cuộc gọi này!
  • Điều gì có thể khiến cuộc gọi đến kết nối sp_reset mất một khoảng thời gian không nhỏ.

Điều này hoàn toàn là điều bí ẩn đối với tôi và tôi đánh giá cao sự giúp đỡ của mọi người!

+0

Nếu bạn có một dấu vết profiler cho thấy sp_reset_connetion mất một thời gian dài, tại sao bạn không nhìn vào những gì công việc mà khách hàng đã làm trước khi cuộc gọi? Điều đó sẽ cung cấp cho bạn một ý tưởng về những gì nhà nước đang bị rách trong cuộc gọi. – ahains

+0

có thể trùng lặp của [Sp.c _reset \ _connection làm gì?] (Http://stackoverflow.com/questions/596365/what-does-sp-reset-connection-do) –

Trả lời

12

Việc đặt lại chỉ cần đặt lại mọi thứ để bạn không phải kết nối lại để đặt lại chúng. Nó xóa sạch kết nối của những thứ như SET hoặc USE hoạt động để mỗi truy vấn có một slate sạch.

Kết nối vẫn đang được sử dụng lại.Dưới đây là một extensive list:

sp_reset_connection resets các khía cạnh sau của một kết nối:

  • Nó reset tất cả các tiểu bang lỗi và số (như @@ ​​lỗi)
  • Nó dừng (bối cảnh thực hiện) tất cả của EC mà là các chủ đề con của cha mẹ EC thực thi truy vấn song song
  • Nó sẽ chờ cho bất kỳ hoạt động I/O nổi bật nào nổi bật
  • Nó sẽ giải phóng mọi bộ đệm được giữ trên máy chủ b y kết nối
  • Nó sẽ mở khóa bất kỳ tài nguyên đệm được sử dụng bởi kết nối
  • Nó sẽ phát hành tất cả các bộ nhớ được phân bổ thuộc sở hữu của các kết nối
  • Nó sẽ xóa tất cả các công việc hoặc tạm thời bảng được tạo ra bởi sự kết nối
  • Nó sẽ giết chết tất cả các con trỏ toàn cầu thuộc sở hữu của các kết nối
  • Nó sẽ đóng bất kỳ xử lý SQL XML mở được mở
  • Nó sẽ xóa bất kỳ bàn làm việc mở liên quan đến SQL XML
  • Nó sẽ đóng tất cả các hệ thống ta Bles
  • Nó sẽ đóng tất cả các bảng sử dụng
  • Nó sẽ thả tất cả các đối tượng tạm thời
  • Nó sẽ hủy bỏ giao dịch mở
  • Nó sẽ đào tẩu từ một giao dịch phân phối khi gia nhập
  • Nó sẽ giảm các số tài liệu tham khảo cho người dùng trong cơ sở dữ liệu hiện tại; mà phát hành chia sẻ cơ sở dữ liệu khóa
  • Nó sẽ giải phóng ổ khóa mua
  • Nó sẽ phát hành bất kỳ xử lý nào có thể được mua lại
  • Nó sẽ thiết lập lại tất cả tùy chọn SET với các giá trị mặc định
  • Nó sẽ thiết lập lại giá trị @@ ROWCOUNT
  • Nó sẽ thiết lập lại @@ bản sắc giá trị
  • Nó sẽ thiết lập lại bất kỳ tùy chọn mức độ phiên dấu vết sử dụng TRACEON dbcc()

sp_reset_connection sẽ KHÔNG reset:

  • bối cảnh an ninh, đó là lý do tại sao trận đấu kết nối tổng hợp các kết nối dựa trên chuỗi kết nối chính xác
  • Nếu bạn bước vào một vai trò ứng dụng sử dụng sp_setapprole, vì vai trò ứng dụng không thể được chuyển
  • mức cô lập giao dịch (!)
1

Dưới đây là một lời giải thích của What does sp_reset_connection do? mà nói, trong phần "lớp truy cập dữ liệu của API như ODBC, OLE-DB và SqlClient gọi (nội bộ) st ored procedure sp_reset_connection khi tái sử dụng kết nối từ một nhóm kết nối. Nó làm điều này để thiết lập lại trạng thái của kết nối trước khi nó được tái sử dụng. "Sau đó, nó đưa ra một số chi tiết cụ thể của những gì mà hệ thống sproc làm. Đó là một điều tốt.

1

sp_resetconnection sẽ được gọi mỗi lần bạn yêu cầu kết nối mới từ một nhóm. Nó phải làm điều này vì hồ bơi không thể đảm bảo người dùng (bạn, lập trình viên có thể :) đã để lại kết nối ở trạng thái thích hợp. ví dụ. Trả lại kết nối cũ với các giao dịch không được thỏa thuận sẽ là ..bad.

Nr cuộc gọi phải liên quan đến số lần bạn tìm nạp kết nối mới.

Đối với một số cuộc gọi có lượng thời gian không nhỏ, tôi không chắc chắn. Có thể máy chủ chỉ bận rộn xử lý các nội dung khác tại thời điểm đó. Có thể là sự chậm trễ mạng.

1

Về cơ bản các cuộc gọi là thông tin trạng thái rõ ràng. Nếu bạn có BẤT K open DataReaders mở nào thì sẽ mất nhiều thời gian hơn để xảy ra. Điều này là do DataReaders của bạn chỉ đang nắm giữ một hàng duy nhất, nhưng có thể kéo thêm hàng. Họ từng phải được xóa trước khi thiết lập lại có thể tiến hành. Vì vậy, hãy chắc chắn rằng bạn có tất cả mọi thứ trong việc sử dụng() báo cáo và không để lại những điều mở trong một số báo cáo của bạn.

Có bao nhiêu tổng số kết nối bạn đã chạy khi điều này xảy ra?

Nếu bạn có tối đa 5 và bạn nhấn tất cả 5 thì việc gọi lại sẽ bị chặn - và có vẻ như sẽ mất nhiều thời gian. Nó thực sự không phải là, nó chỉ là bị chặn chờ đợi trên một kết nối gộp lại để trở thành có sẵn.

Ngoài ra nếu bạn đang chạy trên SQL Express, bạn có thể bị chặn do yêu cầu luồng rất dễ dàng (cũng có thể xảy ra trong SQL Server đầy đủ, nhưng ít khả năng hơn).

Điều gì sẽ xảy ra nếu bạn tắt tính năng kết nối tổng hợp?

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