2010-07-27 32 views
9

Tôi đang sử dụng ADO.Net cho một số kết nối cơ sở dữ liệu và tôi chỉ hy vọng tôi đã làm đúng cách. Tôi đang mở và đóng nhiều kết nối cho mỗi thủ tục lưu sẵn. Hoặc tôi nên được gói này lên chỉ trong một kết nối mở (ít tài nguyên trên cơ sở dữ liệu có thể?) Cảm ơn, và nếu có bất cứ điều gì kỳ lạ hoặc một cái gì đó tôi có thể làm tốt hơn cho tôi biết cảm ơn!Thực tiễn tốt nhất? mở và đóng nhiều kết nối, hoặc một kết nối mở lớn cho ado.net

Ví dụ: này nhưng tôi có như 6 trong số họ ...

using (SqlConnection conn = new SqlConnection(ConnectionString)) 
{ 
    SqlCommand cmd = new SqlCommand("spSelectAllTrip", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    conn.Open(); 
    ddlTripTypeA.DataSource = cmd.ExecuteReader(); 
    ddlTripTypeA.DataTextField = "TripType"; 
    ddlTripTypeA.DataValueField = "TripTypeAID"; 
    ddlTripTypeA.DataBind(); 
} 
using (SqlConnection conn = new SqlConnection(ConnectionString)) 
{ 
    SqlCommand cmd = new SqlCommand("spSelectAllTripB", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    conn.Open(); 
    ddlTripTypeB.DataSource = cmd.ExecuteReader(); 
    ddlTripTypeB.DataTextField = "TripType"; 
    ddlTripTypeB.DataValueField = "TripTypeBID"; 
    ddlTripTypeB.DataBind(); 
} 

Trả lời

5

. Net có kết nối tổng hợp đã được quản lý cho bạn, do đó bạn không cần phải lo lắng về việc sử dụng lại các kết nối như bạn có thể có với asp cũ. Tôi luôn luôn đi với một số cuộc gọi nhanh nhỏ và giữ một mở toàn bộ thời gian bởi vì không phải tất cả thời gian nó mở thường được sử dụng cho các cuộc gọi. Bạn có mã trang web của bạn đang chạy làm một số điều giữa là tốt.

Bây giờ, nếu bạn định thực hiện 6 cuộc gọi liên tiếp cái khác thì có thể mở một cuộc gọi và sử dụng lại. Nhưng khác hơn là tôi nói chỉ gắn bó với những gì bạn đang làm.

Điều duy nhất bạn có thể muốn xem xét là trình quản lý kết nối để bạn không phải tạo đối tượng kết nối trong .net lặp đi lặp lại. Nhưng điều đó không liên quan gì đến kết nối db và chỉ tạo đối tượng.

+2

có một liên kết tốt cho quản lý kết nối? cho C# – Spooks

+0

Đồng ý, nếu bạn đang chạy nhiều mục trong một "lô", hãy thực hiện tất cả công việc bạn có thể, rồi đóng lại sớm; chắc chắn không có kết nối nán lại xung quanh. Vì vậy, càng nhiều càng tốt ... mở db conn càng muộn càng tốt, thực hiện, đóng db conn càng sớm càng tốt, và cố gắng không giữ kết nối mở lâu hơn là cần thiết. – SnapJag

3

Bạn nên giữ các kết nối mở như một thời gian ngắn càng tốt. Vì vậy, bạn muốn mở một kết nối, thực hiện một truy vấn hoặc thủ tục lưu trữ và sau đó đóng kết nối. Mặc dù điều này nghe có vẻ đắt tiền, nó thúc đẩy việc kết nối tích hợp sẵn của ADO.NET. Khi bạn đóng một kết nối, nó được trả về một hồ bơi và được tái sử dụng để bạn không bị ảnh hưởng.

+0

điểm là tranh luận, nếu tất cả các hoạt động chống lại kết nối xảy ra trong cùng một phương pháp. –

+0

@Mitch Wheat - Có phải phương pháp giống nhau không? Điều đó không rõ ràng từ OP. – Thomas

+0

@Mitch Wheat - Ngoài ra còn có một vấn đề khác về việc trộn lẫn mã truy cập dữ liệu với mã trình bày ... – Thomas

0

ADO.Net sử dụng kết nối tổng hợp, do đó sẽ giảm chi phí mở kết nối mới tránh bất kỳ cần phải có một kết nối mở trong suốt toàn bộ ứng dụng của bạn.

Tuy nhiên, có lẽ vẫn còn một số chi phí để xáo trộn các kết nối trong hồ bơi, vì vậy nếu bạn có mã chạy tuần tự và ngay lập tức, trong cùng một phần mã của bạn thì có lẽ bạn nên sử dụng kết nối duy nhất cho khoảng thời gian ngắn đó. Kiểm tra câu trả lời của Adam để biết thêm một chút về điều đó - bạn muốn mọi thứ khác được thiết lập trước để kết nối được mở trong thời gian ngắn nhất có thể.

Nếu bất kỳ lập trình viên ADO.Net nào có thể xác nhận hoặc sửa lỗi này, vui lòng thực hiện.

+0

Cảm thấy tự do để chỉ ra những gì sai với câu trả lời của tôi khi bạn bỏ phiếu cho tôi để, tôi không biết, có lẽ mọi người thực sự có thể học một cái gì đó –

+0

Nó không phải là tôi, nhưng kết nối tổng hợp trong. Ngoài ra, những gì bạn nói là khá chính xác. –

+0

Cảm ơn. Tôi sẽ thay đổi câu trả lời của tôi để phản ánh điều đó. –

1

Một cách tốt hơn để làm điều này sẽ được chuẩn bị cả hai lệnh và sau đó mở kết nối và thực hiện cả hai liên tiếp nhanh chóng:

conn.Open(); 
comm1.ExecuteReader(); 
comm2.ExecuteReader(); 

Luôn giữ cho chúng mở cho một thời gian ngắn càng tốt.

+0

Tôi sẽ phải cung cấp cho một thử này, có vẻ như khá sạch sẽ – Spooks

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