2012-03-21 32 views
7

tôi không sử dụng LINQ-to-SQL hoặc Entity Framework bit trong một ứng dụng web, và vẫn đang được sử dụng một cái gì đó như thế này (đây là cho một dự án lớp):Làm thế nào để duy trì kết nối cơ sở dữ liệu trong ứng dụng ASP.NET MVC?

using System.Data; 
using System.Data.SqlClient; 

namespace StackOverflowClone.Models 
{ 
    public class Database 
    { 
     public static SqlConnection ActiveConnection { get; private set; } 

     static Database() 
     { 
      ActiveConnection = new SqlConnection(
       "Data Source=********.database.windows.net;" + 
       "Initial Catalog=EECS341;Uid=*****;Pwd=*******;" + 
       "MultipleActiveResultSets=True;"); 
      ActiveConnection.Open(); 
     } 
    } 
} 

Tuy nhiên điều này dường như gây ra vấn đề luồng vì trình khởi tạo tĩnh chạy một lần cho mỗi quá trình máy chủ, thay vì một lần cho mỗi yêu cầu.

Khung làm việc có cung cấp phương thức xử lý được tích hợp này hay tôi chỉ nên có một chức năng làm tăng các kết nối cơ sở dữ liệu mới mỗi lần?

+0

@TomasVoracek: Vấn đề là có thể có nhiều người dùng được phân phối cùng một lúc và kết nối đôi khi bị nhầm lẫn và không truy vấn được do một chuỗi khác vẫn đang đọc kết quả từ truy vấn trước đó. –

Trả lời

12

hoặc tôi chỉ nên có một chức năng làm tăng kết nối cơ sở dữ liệu mới mỗi lần?

Có, thực hiện việc này. Hãy để ADO.NET connection pooling xử lý các chi tiết cho bạn. Mục tiêu của bạn nên giữ cho kết nối mở trong một khoảng thời gian ngắn nhất có thể.

Kết nối tổng hợp làm giảm số lần kết nối mới phải được mở. Pooler duy trì quyền sở hữu của kết nối vật lý . Nó quản lý các kết nối bằng cách giữ một tập hợp các kết nối hoạt động cho mỗi cấu hình kết nối đã cho. Bất cứ khi nào một người sử dụng cuộc gọi Mở trên một kết nối, các pooler tìm kiếm một kết nối có sẵn trong hồ bơi. Nếu có kết nối gộp, nó trả về cho người gọi thay vì mở một kết nối mới. Khi các cuộc gọi ứng dụng Đóng trên kết nối, máy chia sẽ trả về số bộ kết nối hoạt động gộp lại thay vì đóng kết nối. Sau khi kết nối được trả về hồ bơi, kết nối đã sẵn sàng để được sử dụng lại trên Cuộc gọi mở tiếp theo.

Vì vậy, hãy tạo phương thức tĩnh GetConnection() trả về kết nối mới mở. Sử dụng điều này trong câu lệnh using để có thể đóng và trả lại câu hỏi này cho hồ sơ kết nối càng sớm càng tốt.

using(var cn = Database.GetConnection()) 
{ 
    //query your data here, Dapper example below 
    cn.Execute("update MyTable set MyField = @newValue", new {newValue}); 
} 
+0

Kết nối tổng hợp? Cái gì thế? –

+0

@BillyONeal - [Hồ bơi kết nối] (http://en.wikipedia.org/wiki/Connection_pool). – Oded

+2

@BillyONeal: Có vẻ như đó là một nhóm kết nối ... Có thể Google biết nhiều hơn. –

4

Luôn tạo kết nối mới và hủy chúng bằng using. Chúng không thực sự được tạo từ đầu, chúng được lấy từ một số connection pool. Không có hình phạt về hiệu suất. Trên thực tế đó là cách tốt nhất và chính xác để đi.

Xem câu trả lời của tôi về using: https://stackoverflow.com/a/9811911/290343

+0

: thở dài: một mức độ sâu khác của việc sử dụng để chạy một truy vấn đơn giản. Chúng tôi đã có một cho SqlCommand, một cho giao dịch, một cho người đọc, và một cho các hồ sơ đọc vòng lặp. Tôi đoán nếu đó là những gì chúng tôi phải làm đó là những gì chúng tôi phải làm, nhưng nó có vẻ đau đớn để làm điều này mỗi lần. –

+0

@BillyONeal phụ thuộc vào API bạn sử dụng để truy cập cơ sở dữ liệu. Tôi khuyên bạn nên xem [Dapper] (http://www.google.ca/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCsQFjAA&url=http%3A%2F%2Fcode.google.com%2Fp % 2Fdapper-dot-net% 2F & ei = PjRqT76cMqLf0QGBwozxAQ & usg = AFQjCNHDo-0KnatIhtMQ4pvQ0QLhup59Wg). Vô cùng đơn giản. – RedFilter

+0

@BillyONeal: Bạn có thể ngăn xếp bằng cách sử dụng câu lệnh ... Nếu tôi có nhiều, tôi tránh đặt một cú đúp vào dòng tiếp theo. Làm cho nó sạch hơn rất nhiều. –

1

Liệu khuôn khổ cung cấp một xây dựng trong phương pháp xử lý này hoặc nên tôi chỉ có một chức năng mà ho ra các kết nối cơ sở dữ liệu new'd lên mỗi lần?

Cả hai, trên thực tế.

Máy chủ web đa luồng, vì vậy mỗi luồng cần có kết nối cơ sở dữ liệu riêng. Chỉ cần tạo một khi cần.

Kết nối thực tế với cơ sở dữ liệu được gộp chung. Khi bạn vứt bỏ một đối tượng kết nối, kết nối thực tế không được đóng lại, nhưng trở về hồ bơi.Nếu bạn tạo một đối tượng kết nối mới với cùng một chuỗi kết nối, nó sẽ chỉ tái sử dụng một kết nối từ nhóm.

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