2010-01-07 8 views
5

Một thời gian sau, tôi đã viết một lớp ORM cho ứng dụng .net của mình nơi tất cả các hàng cơ sở dữ liệu được đại diện bởi một lớp con của DatabaseRecord. Có một số phương pháp như Load(), Save() v.v. Trong lần triển khai ban đầu của tôi, tôi đã tạo kết nối tới DB trong hàm tạo của DatabaseRecord ví dụ:Phần trên của việc tạo SqlConnection mới trong C#

connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString 
); 

sau đó tôi gọi Open()Close() vào đó SqlConnection vào đầu và kết thúc của các phương pháp của tôi mà truy cập vào cơ sở dữ liệu. Điều này dường như với tôi (như một người đã quen thuộc với lập trình nhưng mới với C# và .net) là cách hiệu quả nhất để làm việc - có một kết nối và mở/đóng nó khi cần thiết trong lớp.

Tôi vừa mới được làm một số đọc và mặc dù nó xuất hiện rằng mô hình này được khuyến cáo ở một số nơi:

using (var connection = new SqlConnection(...)) { 
    connection.Open(); 
    // Stuff with the connection 
    connection.Close(); 
} 

tôi có thể thấy lý do tại sao nó mong muốn - kết nối được tự động Dispose() d ngay cả khi công cụ bạn làm ở giữa gây ra một ngoại lệ không bị bắt. Tôi đã chỉ tự hỏi những gì trên là để gọi new SqlConnection() có khả năng nhiều lần như thế này.

Kết nối Pooling được bật vì vậy tôi tưởng tượng chi phí là tối thiểu và cách tiếp cận thứ hai nên là thực hành tốt nhất nhưng tôi chỉ muốn đảm bảo giả định của tôi là đúng.

+0

Cảm ơn tất cả các câu trả lời nhanh chóng đáng kinh ngạc! – vitch

Trả lời

8

Vâng, đó là phương pháp hay nhất. using thực hiện cuộc gọi của bạn để đóng() ngoại lệ an toàn.

Và chi phí của việc tạo đối tượng (bất kỳ) thực sự là tối thiểu và nhỏ nhất cho các đối tượng sống ngắn (ở lại trong thế hệ GC 0).

Lưu ý rằng bạn không phải gọi Close() ở cuối khối sử dụng nữa, nó sẽ tự động được thực hiện cho bạn (Dispose == Close).

+0

Mức độ tối thiểu? Có bất kỳ điểm chuẩn nào ở bất kỳ nơi nào cho thấy hiệu suất bị mất từ ​​việc mở và đóng kết nối không? Có một cái bắt tay mạng nào được bật khi phương thức Open được gọi không? –

+0

Thực ra, tôi nghĩ bài viết này trả lời câu hỏi của tôi một cách hoàn hảo. https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling –

+0

Nếu bài viết này là chính xác, kết nối tổng hợp nên xử lý rõ ràng việc bắt tay, v.v.và đảm bảo rằng không cần bắt tay không cần thiết. –

1

Đây là một phần quan trọng về hương vị. Miễn là bạn sử dụng kết nối tổng hợp chi phí của việc tạo mới (tái chế kết nối gộp) sẽ là tối thiểu, do đó, chung mẫu được đề nghị là tạo các đối tượng kết nối mới nếu cần.

Nếu bạn chạy nhiều lệnh ngay sau mỗi lần khác thì tôi không thấy lý do nào để tạo kết nối mới cho từng lệnh, nhưng bạn nên tránh giữ để mở kết nối trong một thời gian dài.

Ngoài ra, bạn nên lưu ý rằng phương thức Dispose sẽ đóng kết nối cho bạn. Vì vậy, không cần phải gọi cả hai CloseDispose. Vì điều khoản using sẽ gọi là xử lý khi kết thúc, thông thường không cần gọi số Close.

1

Nếu bạn không chắc chắn về chi phí khai mạc/kết nối đóng, có SqlConnection một biến thành viên của lớp học của bạn, nhưng làm cho lớp IDisposable và định đoạt của SqlConnection khi lớp được xử lý

+0

Trên thực tế, suy nghĩ về nó nhiều hơn tôi nghĩ rằng đây có thể là cách tiếp cận hiệu quả hơn. Tôi đã đưa ra gợi ý của bạn một chút trong một câu hỏi khác - nó sẽ là tuyệt vời nếu bạn có thể cho tôi biết nếu tôi hiểu đúng: http://stackoverflow.com/questions/2020576/creating-an-idisposable-class-in -c-which-cleans-up-an-sqlconnection-khi-kết thúc – vitch