シングルトンクラスを介してdb接続を取得する
-
03-07-2019 - |
質問
シングルトンクラスを作成しました。このクラスはデータベース接続を返します。だから私の質問は、この接続もシングルトン基準を満たしているのですか?
いいえ、シングルトンにする方法よりも。
コードは次のとおりです。
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;
}
}
解決
シングルトンはまだオフです。
シングルトンパターンに関する限り、Jon Skeetの非常に優れた詳細な説明を参照してください: http://www.yoda.arachsys.com/csharp/singleton.html
SqlConnectionオブジェクトにシングルトンを使用することは、本当に悪い考えです。これを行う理由はまったくありません。
" new SqlConnection()"のパフォーマンスヒットを回避しようとしている場合または" connection.Open()"背後で接続プーリングが行われているため、実際にはパフォーマンスヒットはありません。接続プーリングは、 高価な 接続の開始/終了を処理します。 SqlConnectionオブジェクトではありません。
接続で複数のSqlDataReaders / Commandsを同時に開くことはできず、同じ接続オブジェクトを複数のスレッドで共有しようとすると、スレッドブロックの問題が発生します。
シングルトンパターンは、最も頻繁に使用され、乱用されたパターンであり、シングルトンには多くの副作用があります。シングルトンの危険性については、 http://www.youtube.com/watch?vで非常に良い話をしてください。 = -FRm3VPhseI
他のヒント
.NET C#では、このようにシングルトンを記述できます
public class Singleton{
public static readonly Singleton Instance= new Singleton();
private Singleton(){}
またはマルチスレッド環境の場合:
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;
}
}
}
データベース接続オブジェクトの複数のインスタンスを作成できるため、接続自体はシングルトン基準を満たしていません。定義上、シングルトンは1回しかインスタンス化できません。
例を変更することで、SqlConnectionをシングルトンの一部に できます:
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;
}
}
このようにして、SingletonDBクラスで使用されるSqlConnectionにはSqlConnectionが1つだけ存在するため、Singletonパターンに従います。
DBへの接続を取得する他の方法がなく、この属性を上書きできない場合は、yesと言います。それがあなたがしていることであれば、おそらくこのシングルトンのことをやりすぎているでしょう。 DBが一時的にダウンし、アプリの接続が失われた場合はどうなりますか?その後、DBを再び使用できるようにするには、アプリを再起動する必要があります。
コードを見ずにその質問に答えることはできないと思います。アプリケーションにDB接続インスタンスが1つだけあると言っている場合、アプリケーションが1つのスレッドのみで実行されることを保証できる場合(または、少なくともDB接続を使用するすべての操作が実行できることを保証できる場合)は、動作する可能性があります't(とにかく知っている限り)同じ接続で複数の操作を並列で実行します。
また、アプリケーションが使用と使用の間に接続を開いたままにすることを意味する場合、私はそれに対して助言します。 DB接続はDBサーバー上の限られたリソースであるため、必要な場合にのみ開いたままにしてから閉じてください。
シングルトンは、作成したクラスを1回だけインスタンス化できることを意味します。それを実現したい場合は、次の2つのことを行います。
- コンストラクタをプライベートにします(これは、他のクラスがコンストラクタにアクセスできないようにするためです)。
-
クラスのインスタンス化:
get { if(instance == null) //important coz, the class will be instantiated only on the first call { instance = new singletonDb; } return instance; }