2009-05-14 22 views
37

Tôi có một lớp tĩnh đơn giản với một vài phương thức trong đó. Mỗi phương thức đó mở một SqlConnection, truy vấn cơ sở dữ liệu và đóng kết nối. Bằng cách này, tôi chắc chắn rằng tôi luôn luôn đóng kết nối với cơ sở dữ liệu, nhưng mặt khác, tôi không muốn luôn luôn mở và đóng kết nối. Dưới đây là ví dụ về phương pháp của tôi.Khi nào tôi nên mở và đóng kết nối với SQL Server

public static void AddSomething(string something) 
{ 
    using (SqlConnection connection = new SqlConnection("...")) 
    { 
     connection.Open(); 
     // ... 
     connection.Close(); 
    } 
} 

Xem xét các phương thức nằm trong lớp tĩnh, tôi có phải là thành viên tĩnh có chứa một SqlConnection không? Làm thế nào và khi nào tôi nên thả nó? Các phương pháp hay nhất là gì?

Trả lời

45

Không, đừng giữ tĩnh SqlConnection trừ khi bạn phải làm vậy. Threading sẽ là một mối quan tâm, nhưng quan trọng hơn - thường bạn chỉ đơn giản là không cần. Với mã của bạn như được trình bày, kết nối nội bộ tổng hợp có nghĩa là hầu hết thời gian bạn sẽ nhận được cùng một kết nối cơ bản trên các cuộc gọi liên tiếp anyway (miễn là bạn sử dụng cùng một chuỗi kết nối). Hãy để người chơi bi-a thực hiện công việc của mình; để lại mã một mình.

Điều này cũng tránh được các vấn đề về những gì xảy ra khi bạn bắt đầu có hai chủ đề ... giờ đây mỗi tác vụ có thể hoạt động trên kết nối của riêng chúng; với tĩnh (giả sử bạn không sử dụng [ThreadStatic]), bạn phải đồng bộ hóa, giới thiệu sự chậm trễ. Chưa kể đến việc ủy ​​thác lại (tức là một chủ đề cố gắng sử dụng cùng một kết nối hai lần cùng một lúc). Yup; để lại mã một mình. Nó là tốt bây giờ, và hầu như bất kỳ thay đổi bạn thực hiện sẽ làm cho nó không tốt.

3

Hầu hết các lập trình viên tin vào việc mở muộn và đóng sớm. Đây chỉ là vấn đề nếu độ trễ mở và đóng kết nối mỗi lần làm cho toàn bộ ứng dụng bị chậm lại.

Trong trường hợp của bạn với lớp tĩnh, tốt nhất là nên mở và đóng kết nối mỗi lần.

+1

+1 Để bù đắp mức giảm giá. Ngay cả một reopen gộp lại sẽ gây ra một cuộc gọi đến một sp_resetconnection, mà incurs một số (ngay cả khi nó là nhỏ) độ trễ. – Andomar

1

Bạn đang thực hiện các phương pháp hay nhất. Chỉ mở nó ngay trước khi bạn truy vấn nó và đóng nó ngay khi bạn có thể. Loại điều này có vẻ như lãng phí lúc đầu, nhưng nó thực sự làm cho ứng dụng của bạn dễ mở rộng hơn trong thời gian dài.

+0

Điều này chỉ áp dụng nếu có thể mở rộng khả năng mở rộng. Ví dụ: một ứng dụng có cơ sở dữ liệu nhúng sẽ được áp dụng các cân nhắc khác nhau. –

18

Vì SqlConnection có một nhóm kết nối khi bạn gọi Open() và Close(), bạn không thực sự mở và đóng kết nối vật lý với máy chủ. Bạn chỉ cần thêm/xóa kết nối khỏi một nhóm các kết nối khả dụng. Vì lý do này, thực hành tốt và tốt nhất để mở kết nối càng muộn càng tốt và đóng kết nối càng sớm càng tốt sau khi thực hiện lệnh của bạn.

5

Trong mẫu mã của bạn, không cần phải gọi phương thức close() trên đối tượng kết nối vì nó sẽ được xử lý tự động do mã nằm trong khối sử dụng.

-1

Đừng bao giờ dựa vào kết nối để đóng chính nó. Nếu nó không được đóng một cách rõ ràng, nó sẽ dẫn đến các vấn đề về hiệu năng. Nó đã xảy ra với chúng tôi trong dự án của chúng tôi. Có, tôi biết rằng các kết nối được quản lý bởi một hồ bơi kết nối, nhưng chúng vẫn phải đóng cửa và quay trở lại hồ bơi.

+0

Anh ta có một cuộc gọi 'sử dụng' xung quanh SqlConnection vì vậy nó nên xử lý kết nối khi nó được thực hiện anyway – lisburnite

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