2008-09-27 27 views
7

Tôi có một ứng dụng gây ra rất nhiều cơn đau đầu. Đó là một ứng dụng .NET kết nối với SQL Server 2005 thông qua một dịch vụ web. Chương trình có lưới được lấp đầy bởi một thủ tục lưu trữ đang chạy dài, dễ bị mất thời gian. Trong trường hợp khi nó hết thời gian và một SqlException được ném, không có xử lý thực hiện để đóng kết nối.Hậu quả của việc không đóng kết nối cơ sở dữ liệu sau một lỗi là gì?

Hậu quả thực tế của tình trạng này là gì? Tôi nghĩ rằng các khuôn khổ hoặc SQL Server có thể chăm sóc nó bằng cách này hay cách khác nhưng tôi không chắc chắn.

Bổ sung Chương trình luôn hoạt động tốt vào buổi sáng, nhưng sau một giờ hoặc lâu hơn về cơ bản, chương trình sẽ ngừng hoạt động. Vấn đề không phải là tôi không biết cách mã hóa kết nối đúng cách. Tôi cần phải biết nếu những triệu chứng này có thể được casued bởi các kết nối không rõ ràng. Nó là một loại lớn để thay đổi mã sản xuất và tôi muốn biết rằng ít nhất có thể cho điều này là vấn đề.

Kết luận Tôi đã thiết kế sự cố này xảy ra trên hàng trăm kết nối đồng thời. Không bao giờ tôi có thể tái tạo điều kiện thất bại trong môi trường ứng dụng. Các phương pháp hay nhất được đánh dấu trả lời là chính xác. Cảm ơn mọi người.

+0

Tôi nghĩ rằng thẻ phải là sql-server chứ không phải hai thẻ riêng biệt khi các câu hỏi hiển thị –

+0

được ghi chú. cảm ơn bạn. –

+0

Có vẻ như bạn đã bật tính năng tổng hợp kết nối trong môi trường sản xuất của mình. Với tính năng gộp nhóm, các kết nối sẽ không bị đóng ngay cả khi bạn yêu cầu họ đóng cửa, vì vậy bạn sẽ không đóng chúng lại. – MusiGenesis

Trả lời

6

Từ một SqlConnection đóng trong khi xử lý tôi thường sử dụng cú pháp này

using (SqlConnection conn = new SqlConnection()) 
{ 
    // SqlCode here 
} 
2

Có giới hạn kết nối; nếu ứng dụng của bạn gặp sự cố thường xuyên và không tự động đóng các kết nối, các yêu cầu kết nối mới sẽ bị từ chối.

Điều đó nói rằng, các kết nối sẽ hết thời gian sau một thời gian nếu chúng không bị đóng.

0

Bạn có thể hết các kết nối khả dụng nếu nó xảy ra thường xuyên, bạn nên sử dụng cuối cùng ở mọi nơi bạn thực hiện lệnh để đóng kết nối.

0

Bộ thu gom rác cuối cùng sẽ hoàn thành đối tượng kết nối mở của bạn, nhưng bạn không biết khi nào GC sẽ xuất hiện trong lần tiếp theo. Cho đến lúc đó bạn có thể chạy ra khỏi các kết nối trong hồ bơi của bạn nếu bạn có rất nhiều lưu lượng truy cập hoặc đó là một máy chủ sql chia sẻ.

Tại sao không vứt bỏ nó trong phần cuối cùng của khối try/catch của bạn?

finally 
{ 
    if (cn != null) 
    { 
     cn.Dispose(); 
     cn = null; 
    } 
} 

Điều này nên được thực hiện trong phương pháp dịch vụ web rõ ràng.

+0

được thực hiện tự động trong khối sử dụng –

+0

Đúng, nhưng rõ ràng là anh ấy "đang sử dụng" không phải ... – Codewerks

+0

Tại sao lại bỏ phiếu cho câu trả lời đúng? Tôi không hiểu ... – Codewerks

0
try 
{ 
    sqlCommandObject.Execute(); // this line will throw a timeout exception 
} 
finally 
{ 
    sqlConnectionObject.Close(); // this will execute no matter what happens 
} 
+0

Tôi nghĩ rằng khuyến nghị từ MS và những người khác là sử dụng Dispose() hoặc như Pablo đã chỉ ra, một khối sử dụng. Dispose() gọi Close() trên đối tượng kết nối và thực hiện dọn dẹp khác nếu cần. – Codewerks

+0

Câu trả lời này là "đúng". http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx "Đóng và Vứt bỏ có chức năng tương đương." –

1

Nếu ứng dụng ngừng hoạt động sau một giờ hoặc lâu hơn, điều đó chắc chắn có thể do các kết nối không bị đóng/hủy bỏ.

1

Đây là lý do tại sao từ khóa 'sử dụng' là rất quan trọng khi sử dụng ADO.Net

using (SqlConnection conn = new SqlConnection()) 
{ 
    ... 
} 

Điều này buộc một loại bộ sưu tập rác xác định trên đối tượng ADO.Net sử dụng giao diện IDispose.

Hầu hết mã cơ sở dữ liệu sử dụng nhiều mệnh đề 'sử dụng' lồng nhau cho mục đích đó.

+0

Giao diện IDispose không liên quan gì đến việc thu thập rác. Nó buộc phát hành định lượng các tài nguyên không được quản lý. – Joe

+0

Joe, tuyên bố của bạn không chính xác. IDispose không liên quan gì đến tài nguyên không được quản lý. Kiểm tra http://www.codeproject.com/KB/mcpp/garbage_collection.aspx, ví dụ. – kervin

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