2009-05-02 37 views
12

Tôi đã tạo một lớp đơn, lớp này trả về kết nối cơ sở dữ liệu. Vì vậy, câu hỏi của tôi là kết nối này cũng đáp ứng tiêu chuẩn singleton?
Nếu không, hơn làm thế nào tôi có thể làm cho nó singleton.
Đây là mã.nhận kết nối db qua lớp singleton

public sealed class SingletonDB 
{ 
    static readonly SingletonDB instance = new SingletonDB(); 
    static SqlConnection con =new SqlConnection(ConfigurationManager.ConnectionStrings["mydb"].ConnectionString); 

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static SingletonDB() 
    { 
    } 

    SingletonDB() 
    { 
    } 

    public static SingletonDB Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 

    public static SqlConnection GetDBConnection() 
    { 
     return con; 
    } 
} 
+1

mã cập nhật, bây giờ nhận xét về mã mới – Sharique

+0

bạn có nghĩ đến việc tiêm phụ thuộc SQLConnection vào lớp singleton của bạn không? –

Trả lời

23

Singleton của bạn vẫn tắt.

Theo như mô hình singleton đi, xin vui lòng xem mô tả rất tốt và chi tiết của Jon Skeet đây: http://www.yoda.arachsys.com/csharp/singleton.html

Sử dụng một Singleton cho một đối tượng SqlConnection là một ý tưởng thực sự, thực sự xấu. Không có lý do gì để làm điều này.

Nếu bạn đang cố gắng để tránh một hit hiệu suất của "mới SqlConnection()" hoặc "connection.Open()" được thông báo rằng có thực sự là không có hiệu suất nhấn có vì kết nối tổng hợp đang diễn ra đằng sau hậu trường. Kết nối Pooling xử lý việc mở/đóng của các kết nối đắt tiền. Không phải đối tượng SqlConnection.

Bạn sẽ không thể mở nhiều SqlDataReaders/Lệnh với kết nối cùng một lúc và sẽ chạy vào các vấn đề chặn luồng nếu bạn đang cố gắng chia sẻ cùng một đối tượng kết nối với nhiều luồng.

Mẫu Singleton là mẫu được sử dụng nhiều nhất và bị lạm dụng và có nhiều tác dụng phụ của singleton mà bạn có thể không biết.Rất tốt nói về sự nguy hiểm của người độc thân ở đây http://www.youtube.com/watch?v=-FRm3VPhseI

+0

Tất cả cuộc sống của tôi tôi đã lừa với không thực hiện một kết nối trên mọi cuộc gọi vì "nó giết hiệu suất ứng dụng". – BlaShadow

+0

Một liên kết đến [cập nhật bài viết của Jon Skeet] (http://csharpindepth.com/Articles/General/Singleton.aspx) trên mẫu đơn có thể có ích. – Corio

1

Nếu không có cách nào khác để kết nối với DB và nếu thuộc tính này không thể ghi đè, tôi sẽ nói có. Nếu đó là những gì bạn đang làm, có lẽ bạn đang dùng cái này đơn quá xa. Điều gì sẽ xảy ra nếu DB tạm thời ngừng hoạt động và ứng dụng của bạn mất kết nối? Sau đó, bạn sẽ phải khởi động lại ứng dụng của mình để ứng dụng có thể sử dụng lại DB.

1

Tôi không thể trả lời câu hỏi đó mà không thấy một số mã, tôi nghĩ vậy. Nếu bạn đang nói rằng bạn sẽ chỉ có một cá thể kết nối DB trong ứng dụng của bạn, điều đó có thể hoạt động nếu bạn có thể đảm bảo rằng ứng dụng của bạn sẽ chỉ chạy trên một luồng (hoặc ít nhất là tất cả các hoạt động sử dụng kết nối DB), vì bạn có thể 't (theo như tôi biết anyway) chạy một số hoạt động song song trên cùng một kết nối.

Ngoài ra, nếu điều đó có nghĩa là ứng dụng của bạn sẽ giữ kết nối mở ở giữa các lần sử dụng, tôi khuyên bạn nên sử dụng nó. Kết nối DB là các tài nguyên giới hạn trên máy chủ DB, vì vậy bạn nên giữ chúng chỉ khi chúng cần thiết và sau đó đóng chúng lại.

4

Bản thân kết nối không đáp ứng tiêu chí Singleton vì bạn có thể tạo nhiều phiên bản của đối tượng kết nối cơ sở dữ liệu. Một singleton theo định nghĩa chỉ có thể được khởi tạo một lần.

Bạn thể làm cho SqlConnection một phần của Singleton, bằng cách thay đổi ví dụ của bạn như thế này:

public sealed class SingletonDB 
{ 
    private static readonly SingletonDB instance = new SingletonDB(); 
    private readonly SqlConnection con =new SqlConnection(ConfigurationManager.ConnectionStrings["mydb"].ConnectionString); 

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static SingletonDB() 
    { 
    } 

    private SingletonDB() 
    { 
    } 

    public static SingletonDB Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 

    public SqlConnection GetDBConnection() 
    { 
     return con; 
    } 

}

Bằng cách này, SqlConnection được sử dụng bởi lớp SingletonDB của bạn sẽ có một và chỉ một SqlConnection, do đó theo mẫu Singleton.

+0

Tôi đã thay đổi mã, hãy kiểm tra ngay bây giờ. – Sharique

1

Singleton có nghĩa là lớp mà bạn đã tạo có thể được khởi tạo chỉ một lần. Vì vậy, nếu bạn muốn điều đó xảy ra, làm hai việc:.

  1. Tận dụng tin constructor (Điều này là để ngăn chặn các lớp khác truy cập vào nó.)
  2. nhanh chóng lớp như:

    get 
    { 
    if(instance == null) //important coz, the class will be instantiated only on the first call 
    { 
        instance = new singletonDb; 
    } 
    return instance; 
    } 
    
4

Trong .NET C# bạn có thể wrtie singleton bạn như thế này

public class Singleton{ 
public static readonly Singleton Instance= new Singleton(); 
private Singleton(){} 

hoặc cho môi trường đa luồng:

using System; 

public sealed class Singleton 
{ 
    private static volatile Singleton instance; 
    private static object syncRoot = new Object(); 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      lock (syncRoot) 
      { 
       if (instance == null) 
        instance = new Singleton(); 
      } 
     } 

     return instance; 
     } 
    } 
} 
+0

Vui lòng xem Trang MSDN này để biết thêm thông tin: https://msdn.microsoft.com/en-us/library/ff650316.aspx –

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