2009-12-01 28 views

Trả lời

6

Tôi sẽ nói không chia sẻ đối tượng kết nối chính nó, chỉ cần tạo một kết nối mới và để ADO.net xử lý kết nối tổng hợp.

+0

Tôi có xu hướng đồng ý, Máy chủ cơ sở dữ liệu được thiết kế để quản lý kết nối tổng hợp, tốt nhất là để cho máy chủ DB được thiết kế để làm. –

10

Nói chung các kết nối không phải là chủ đề an toàn (SqlConnection, MySqlConnection và OracleConnection đặc biệt đề cập rằng chúng không phải là luồng an toàn).

Không chia sẻ kết nối giữa các chuỗi.

0

Không có mã mẫu trong tự nhiên vì (gần như) không ai làm điều đó bởi vì nó là một ý tưởng rất, rất, xấu.

3

Để đáp ứng với các thông số thực tế của câu hỏi, chứ không phải sa thải họ, tôi sẽ quấn DbCommand để giúp đồng bộ hóa truy cập vào các kết nối (khi và chỉ khi bạn hoàn toàn phải).

public class SyncedDbCommand : DbCommand 
{ 
    private DbCommand _cmd; 
    private object _sync; 

    public SyncedDbCommand(DbCommand cmd, object sync) 
    { 
     _cmd = cmd; 
     _sync = sync; 
    } 

    // omitted basic proxy method overrides 

    protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) 
    { 
     Monitor.Enter(_sync); 
     return _cmd.ExecuteReader(); 
    } 

    public override int ExecuteNonQuery() 
    { 
     Monitor.Enter(_sync); 
     return _cmd.ExecuteNonQuery(); 
    } 

    public override object ExecuteScalar() 
    { 
     Monitor.Enter(_sync); 
     return _cmd.ExecuteScalar(); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      Monitor.Exit(_sync); 
     } 
     base.Dispose(disposing); 
    } 
} 

Để sử dụng mẫu, bạn phải nhanh chóng nó với một thực tế DbCommandcũng như một số trường hợp đối tượng được chia sẻ trên tất cả các tập quán của một kết nối. Trong việc sử dụng đơn giản nhất, bạn thậm chí có thể vượt qua đối tượng kết nối chính nó như là đối tượng khóa. Việc diễn giải phải xảy ra trong tuyên bố using. Điều này không cho phép bạn biết chính xác yêu cầu sử dụng của bạn là gì và cách hoạt động của lớp Monitor và khóa.

Cách này hay cách khác, bạn muốn đồng bộ hóa việc sử dụng kết nối giữa các chủ đề và trên đây là một cách tiếp cận để làm như vậy.

+1

Tuyệt đối KHÔNG làm điều này, không có lý do chính đáng để làm như vậy và bạn sẽ ảnh hưởng đến hiệu suất của ứng dụng của bạn. Sử dụng kết nối tổng hợp như trạng thái câu trả lời ở trên. –

+1

"Không có lý do chính đáng"? Không biết kiến ​​trúc mã của mình, làm thế nào bạn có thể tuyên bố điều đó? Đối với việc chia sẻ kết nối, đó là một phương pháp nổi tiếng để cho phép các giao dịch mà không cần quảng bá cho MSDTC. Đây là một lợi ích hiệu suất rất lớn. Tuy nhiên, bắt đầu từ đầu, tất nhiên tôi sẽ không tư vấn cho phương pháp được mô tả trong câu trả lời của tôi. Nhưng trong * tôn trọng người hỏi và trả lời những câu hỏi cụ thể của anh ấy *, đây là lời khuyên của tôi. –

+0

Vẫn đang chờ để được chứng ngộ ... –

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