Trong hầu hết các trường hợp, sự cố 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 chính xác và nhất quán. Khi bạn để các kết nối mở, 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()
phương thức của chúng .
Bạn muốn chắc chắn rằng bạn đang thực sự đóng kết nối . Ví dụ: đoạn mã sau sẽ gây rò rỉ kết nối, nếu mã giữa .Open
và Close
ném ngoại lệ:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
Cách chính xác sẽ là thế này:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
hoặc là
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
Khi hàm của bạn trả về một kết nối từ một phương thức lớp, hãy đảm bảo bạn lưu trữ cục bộ và gọi Close
phương thức đó. Bạn sẽ rò rỉ một kết nối bằng mã này chẳng hạn:
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 đến 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 a OleDbDataReader
, đóng chúng. Mặc dù việc đóng kết nối dường như thực hiện thủ thuật, hãy nỗ lực hết sức để đóng các đối tượng đọ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 tràn bộ đệm kết nối? " 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
hay sp_who2
. Các quy trình được lưu trữ 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 tiến 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, các kết nối làm việc của bạn sẽ dễ dàng tìm thấy.
- Sử dụng SQL Server Profiler với
TSQL_Replay
mẫu SQLProfiler để theo dõi các kết nối mở. Nếu bạn quen thuộc với Profiler, phương pháp này dễ hơn bỏ phiếu bằng cách sử dụng sp_who.
- Sử dụng Trình theo dõi hiệu suất để theo dõi các nhóm và kết nối. Tôi thảo luận về phương pháp này trong một thời điểm.
- Giám sát hiệu suất quầy trong mã. Bạn có thể theo dõi sức khỏe của nhóm kết nối và số lượng kết nối được thiết lập bằng cách sử dụng các thường trình để trích xuất các bộ đếm hoặc bằng cách sử dụng các điều khiển .NET PerformanceCorer mới.