Tôi đã kế thừa một khung web theo đó nhà phát triển trước đó đã mở và đóng các kết nối cơ sở dữ liệu của anh ấy bằng các phương thức init/unload của vòng đời trang. Cơ bản constructor là như thế này (đơn giản hóa để chứng minh điểm);Đóng một conneciton trong phương thức "unload"
public class BasePage
{
protected DBConnection _conn;
public BasePage()
{
Init += StartConnection;
Unload += EndConnection;
}
private void StartConnection(object sender, EventArgs e)
{
_conn = new DBConnection(Application["connectionstring"].ToString());
}
private void EndConnection(object sender, EventArgs e)
{
if (_conn == null)
return;
if (_conn.Connection.State == ConnectionState.Open)
{
_conn.Close();
_conn.Dispose();
}
}
}
Phát triển khá nhanh vì tôi đã đến đây nên tôi chưa bao giờ dừng lại để xem xét. Gần đây, các lượt truy cập đã được cập nhật và chúng tôi đã bắt đầu nhận được thời gian chờ "Thời gian chờ đã hết hạn. Thời gian chờ đã trôi qua trước khi có kết nối từ hồ bơi ...".
Tôi hiện đang trải qua phần còn lại của mã tìm kiếm các rò rỉ kết nối có thể, nhưng đoạn mã trên chưa bao giờ hoàn toàn phù hợp với tôi và tôi muốn loại bỏ nó như là một thủ phạm tiềm năng. Về câu hỏi đó;
Tôi có thể dựa vào phương thức "dỡ" luôn luôn được gọi, ngay cả trong trường hợp ngoại lệ? Hoặc bất cứ ai có thể nhìn thấy bất kỳ vấn đề tiềm năng khác bằng cách sử dụng các mô hình trên mà sẽ làm cho nó một nghi can chính cho những rò rỉ kết nối?
Chúc mừng,
Mikey
EDIT: Trong gỡ lỗi, các phương pháp dỡ bỏ luôn được gọi là thậm chí nếu có một ngoại lệ. Tôi thực sự chỉ cần biết về bất kỳ kịch bản mà phương pháp này sẽ không được gọi là vì vậy tôi có thể tìm ra nếu đây là bit tôi cần phải được refactoring đầu tiên.
CHỈNH SỬA: Cảm ơn những người đã phản hồi cho đến giờ nhưng xin vui lòng không đề xuất thêm về lớp IDisposable hoặc mẫu "sử dụng" hoặc "bắt/cuối cùng" - Đây không phải là câu hỏi của tôi! Câu hỏi của tôi là cụ thể cho dù một trang có thể chạy sự kiện "Init" của nó nhưng sau đó không chạy là "Unload" sự kiện, và tại sao điều này có thể xảy ra.
Phương thức tải là phía máy chủ, vì vậy chắc chắn sẽ không quan trọng những gì người dùng đã làm khi yêu cầu đã được nhận? –
"Đối với chính trang, hãy sử dụng sự kiện này để thực hiện công việc dọn dẹp lần cuối, chẳng hạn như đóng các tệp đang mở và kết nối cơ sở dữ liệu hoặc hoàn tất ghi nhật ký hoặc các tác vụ yêu cầu cụ thể khác". Từ http://msdn.microsoft.com/en-us/library/ms178472.aspx. Vì vậy, bạn có thể vào một cái gì đó, nhưng sau đó một lần nữa nếu bạn nhìn vào liên kết Unload trong bài viết của tôi, bạn sẽ thấy nó không phải lúc nào cũng được gọi. Tôi sẽ không tin vào nó được gọi là, nếu có thể thay vì làm những gì Pranay Rana đề nghị, và đó sẽ là cách chính xác để xử lý kết nối của bạn. – Jethro
Đây cũng là một liên kết thú vị SO http://stackoverflow.com/questions/302149/is-it-acceptable-to-keep-a-db-connection-open-for-the-life-of-the-page, có thể "Thời gian hết hạn" đang được gây ra bởi một cái gì đó khác, hãy thử sử dụng SQL Profiler để xem những gì đang diễn ra trong nền. – Jethro