2010-11-06 78 views
31

Nếu kết nối với cơ sở dữ liệu tiêu tốn rất nhiều tài nguyên, tại sao kết nối cơ sở dữ liệu luôn đóng trong ứng dụng của bạn nếu bạn phải mở lại? Tôi có thể chỉ làm cho kết nối này có sẵn trên toàn cầu trong suốt ứng dụng của tôi để các lớp và phương thức khác có thể tái sử dụng nó không?Tại sao luôn đóng kết nối Cơ sở dữ liệu?

Ví dụ (trong mã giả):

public class PopulateGridViews() 
{ 
    public SqlConnection conn = new SqlConnection(@"Database:DATABASE"); 
    conn.Open(); 

    void PopulateGrid1() 
    { 
     SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE1"); 
     cmd.Connection = conn; 
     cmd.ExecuteNonQuery(); 
     cmd.Dispose(); 
     // Populate Grid1 
    } 

    void PopulateGrid2() 
    { 
     SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE2"); 
     cmd.Connection = conn; 
     cmd.ExecuteNonQuery(); 
     cmd.Dispose(); 
     // Populate Grid2 
    } 
} 
+0

Tôi khuyên bạn nên đọc [SQL Server Connection Pooling (ADO.NET)] (http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx). –

Trả lời

45

Bạn không nên để lại các kết nối mở.

Bạn nên:

  1. mở các kết nối như trễ càng tốt
  2. kết nối Đóng càng sớm càng tốt

Kết nối bản thân được trở lại hồ bơi kết nối. Kết nối là một nguồn lực hạn chế và tương đối đắt tiền. Bất kỳ kết nối mới nào bạn thiết lập có chính xác cùng một chuỗi kết nối sẽ có thể sử dụng lại kết nối từ hồ bơi.

Chúng tôi khuyên bạn luôn đóng kết nối khi bạn đang xong sử dụng nó để kết nối sẽ được trở lại hồ bơi . Bạn có thể thực hiện việc này bằng cách sử dụng các phương thức Đóng hoặc Xử lý đối tượng hoặc bằng cách mở tất cả các kết nối trong câu lệnh sử dụng trong C# hoặc câu lệnh Sử dụng trong Visual Cơ bản. Các kết nối không phải là đóng kín một cách rõ ràng có thể không được thêm hoặc quay lại hồ bơi. Để biết thêm thông tin , hãy xem sử dụng Báo cáo (C# Tham chiếu) hoặc Cách: Vứt bỏ một tài nguyên hệ thống cho Visual Basic. Ref.

Bạn một cách thích hợp nên quấn bất cứ điều gì mà thực hiện IDisposable trong một khối using tuyên bố:

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    connection.Open(); 

    ... 

    command.ExecuteNonQuery(); 
} 
+0

nơi tôi nên đặt bắt nếu một số lỗi xảy ra trong khi kết nối? – yonan2236

+1

Nếu bạn sử dụng khối sử dụng như @Mitch Wheat được đề xuất, nó sẽ tự động bị đóng nếu có lỗi. – David

+0

Vì vậy, không có cách nào để xác định để biết các lỗi xảy ra? – yonan2236

6

Vì (một số) cơ sở dữ liệu cũng giữ mở một kết nối đến nói với ứng dụng gọi điện thoại để đóng nó lại. Nếu bạn nhận được hàng trăm cuộc gọi đến một cơ sở dữ liệu thì nó đang ngồi ở đó với 100 kết nối mở kết nối tài nguyên. Không có gì lạ khi có hàng ngàn hoặc hàng trăm nghìn cuộc gọi đến một cơ sở dữ liệu trong một ứng dụng bận rộn, và sớm hay muộn hiệu năng DB sẽ giết hiệu suất của ứng dụng.

Đó thực sự là cảm giác thông thường. Nếu bạn có một lý do hợp lệ để giữ cho nó mở, sau đó làm như vậy. Nếu không, hãy đóng nó ngay sau khi bạn hoàn thành nó. Nhưng tốt hơn là nên có thói quen tốt để đóng các kết nối để bạn không chỉ để chúng mở khi bạn không có ý định. Đó là một thói quen tốt như đeo dây an toàn hoặc đóng cửa tủ lạnh khi bạn không lấy thức ăn.

Bài viết này khẳng định nó tốt (ngay cả khi nó là một chút lỗi thời):

http://www.bewebmaster.com/84.php

Một vấn đề phổ biến trong lưu trữ công ty là ASP trang web không đóng kết nối cơ sở dữ liệu sau khi chúng được mở ra. Đây là bước cơ bản mà bạn nên xem là một phần của mã số bắt buộc . Nếu bạn không đóng kết nối cơ sở dữ liệu của mình, nhiều sự cố có thể xảy ra như các trang web treo, tải trang chậm và hơn thế nữa.

Hãy nghĩ về điều đó khi đi qua cánh cửa đến ngôi nhà của bạn. Có lẽ cánh cửa sẽ tự đóng lại , nhưng có lẽ nó sẽ không đóng. Nếu nó không đóng, ai biết điều gì sẽ xảy ra . Nếu bạn sống ở đất nước, một con gấu có thể đi vào. Nếu bạn sống ở thành phố , người Mugger có thể đi bộ. Alright, cũng có thể để lại cơ sở dữ liệu kết nối mở sẽ không dẫn đến bất cứ điều gì nó sẽ dẫn đến rất nhiều sự cố đau đầu không cần thiết cho cả bạn và cho công ty lưu trữ của bạn.

+1

Chúng tôi đã có một ứng dụng mà chúng tôi thừa kế tại các kết nối rò rỉ công việc, nó không tốt đẹp: (Sau một thời gian SQL Server ngừng đáp ứng các kết nối mới. Điều này cũng có nghĩa là mọi ứng dụng khác đều ngừng hoạt động. – Skurmedel

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