2009-06-19 39 views
5

Tôi đã nghi ngờ rằng kết nối cơ sở dữ liệu được sử dụng trong một trong các ứng dụng của chúng tôi không phải lúc nào cũng đóng. Tôi đã đi xem mã và tôi đã tìm thấy một lớp DataProvider có đối tượng SqlConnection. Kết nối được mở trong constructor của lớp này và đóng trong phương thức Dispose (đừng phán xét điều đó, tôi biết việc giữ kết nối mở là điều ác, nó không phải là mã của tôi và nó cũng không phải là vấn đề). Phương pháp Dispose được thực hiện như thế này:Việc đóng kết nối cơ sở dữ liệu trong phương thức Vứt bỏ có đúng không?

protected virtual void Dispose(bool disposing) 
{ 
    if (!_disposed) 
    { 
     if (disposing) 
     { 
      if (_conn != null) 
       _conn.Close(); 
     } 

     _disposed = true; 
    } 
} 

Câu hỏi đặt ra là:
Liệu nó luôn đảm bảo rằng kết nối được đóng cửa?
Mã này có đúng không?

Tôi nghĩ rằng cần có _conn.Dispose() được gọi - tôi có đúng không và có thể ảnh hưởng đến việc không đóng kết nối (có thể là không)?

+0

Nếu bạn nghi ngờ xác nhận bằng cách kiểm tra bằng cách sử dụng bộ đếm hiệu suất. – RichardOD

+0

Giá trị quan trọng cần kiểm tra là NumberOfPooledConnections. – RichardOD

Trả lời

8

Vứt bỏ không bao giờ được gọi tự động.

Kết nối sẽ không được đóng cửa cho đến phương thức Dispose của đối tượng của bạn được gọi một cách rõ ràng, hoặc nếu lớp học của bạn trong sử dụng trong một sử dụng() chặn

Một cách an toàn hơn là để gọi phương thức dispose trong finalizer của bạn và đảm bảo finalizer bị chặn khi phương thức Dispose được gọi.

This article hiện cách chính xác để thực hiện mô hình

Hy vọng nó sẽ giúp!

Cédric

+0

ok nhưng nếu ứng dụng bị đóng (thông thường hoặc do lỗi) phương pháp vứt bỏ sẽ được gọi và kết nối sẽ bị đóng? – agnieszka

+0

Khi ứng dụng của bạn bị tắt, tất cả các finalizers sẽ được gọi bởi bộ thu gom rác, vì vậy ít nhất các kết nối sẽ được đóng lại như finalizer của các đối tượng Connection sẽ được kích hoạt ... nhưng đó là một cách què để đóng kết nối;) –

+1

Và nhân tiện: Phương pháp vứt bỏ không bao giờ được gọi tự động.Trong trạng thái mã hiện tại của bạn, các kết nối sẽ bị đóng vì phương thức xử lý kết nối được gọi trong finalizers –

2

conn.Dispose(); cũng sẽ đóng kết nối, vì vậy không thể làm tổn thương việc thay đổi kết nối để tuân theo mẫu vứt bỏ.

Nhưng có chức năng tương đương nên phải có sự cố khác ở đâu.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx

Nếu SqlConnection đi ra khỏi phạm vi , nó sẽ không được đóng lại. Do đó, bạn phải đóng kết nối một cách rõ ràng bằng cách gọi Đóng hoặc Vứt bỏ. Đóng và Vứt bỏ là tương đương với chức năng. Nếu giá trị tổng hợp kết nối Kết nối với nhau là được đặt thành true hoặc có, kết nối cơ bản sẽ được trả về hồ bơi kết nối . Mặt khác, nếu Kết nối được đặt thành sai hoặc không, kết nối cơ bản với máy chủ là bị đóng.

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