Trong hầu hết các trường hợp, sự cố gộp kết nối có liên quan đến rò rỉ kết nối . Ứng dụng của bạn có thể không đóng các kết nối cơ sở dữ liệu của nó một cách chính xác và nhất quán. Khi bạn để mở các kết nối, chúng vẫn bị chặn cho đến khi trình thu gom rác .NET đóng chúng cho bạn bằng cách gọi Finalize()
của chúng phương pháp.
Bạn muốn đảm bảo rằng bạn thực sự đóng kết nối . Ví dụ:mã sau sẽ gây ra rò rỉ kết nối, nếu mã giữa .Open
và Close
ném một ngoại lệ:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
Cách chính xác sẽ là:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
hoặc
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
Khi hàm của bạn trả về kết nối từ một phương thức lớp đảm bảo bạn lưu vào bộ nhớ cache cục bộ và gọi Close
của nó phương pháp. Bạn sẽ bị rò rỉ kết nối bằng cách sử dụng mã này, ví dụ:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
Kết nối được trả về từ cuộc gọi đầu tiên tới getConnection()
không bị đóng. Thay vì đóng kết nối của bạn, dòng này tạo một kết nối mới và cố gắng đóng nó.
Nếu bạn sử dụng SqlDataReader
hoặc OleDbDataReader
, đóng chúng. Mặc dù bản thân việc đóng kết nối dường như là một mẹo nhỏ, hãy cố gắng hơn nữa để đóng các đối tượng trình đọc dữ liệu của bạn một cách rõ ràng khi bạn sử dụng chúng.
Bài viết này "Tại sao một nhóm kết nối tràn?" từ Tạp chí MSDN / SQL giải thích rất nhiều chi tiết và đề xuất một số chiến lược gỡ lỗi:
- Chạy
sp_who
hoặcsp_who2
. Các thủ tục được lưu trữ trong hệ thống này trả về thông tin từsysprocesses
bảng hệ thống hiển thị trạng thái và thông tin về tất cả các quy trình làm việc. Nói chung, bạn sẽ thấy một ID quy trình máy chủ (SPID) trên mỗi kết nối. Nếu bạn đặt tên cho kết nối của mình bằng cách sử dụng đối số Tên ứng dụng trong chuỗi kết nối, thì các kết nối đang hoạt động của bạn sẽ dễ dàng tìm thấy. - Sử dụng SQL Server Profiler với SQLProfiler
TSQL_Replay
mẫu để theo dõi các kết nối mở. Nếu bạn đã quen thuộc với Profiler, thì phương pháp này sẽ dễ dàng hơn so với phương pháp thăm dò ý kiến bằng cách sử dụng sp_who. - Sử dụng Màn hình Hiệu suất để theo dõi các nhóm và kết nối. Tôi sẽ thảo luận về phương pháp này trong giây lát.
- Giám sát bộ đếm hiệu suất trong mã. Bạn có thể theo dõi tình trạng của nhóm kết nối của mình và số lượng kết nối đã thiết lập bằng cách sử dụng các quy trình để trích xuất bộ đếm hoặc bằng cách sử dụng các điều khiển .NET PerformanceCounter mới.