3

クラス内の異なるメソッドで同じSQLConnectionを再利用したい。私が今行っていること(テストのみ)は、コンストラクターで接続を作成して開くことです。

SQLConnection Connection;

Constructor(string connection_string)
{
    this.Connection = new SqlConnection(connection_string);
    this.Connection.Open();
}

次に、メソッド内で「this.Connection」を使用し、最後に、オブジェクトが不要になったときにthis.Connection.Close()とDispose()を使用します。私が知っていることから、次のように各メソッド内で「using」を使用する方がクリーンです(コンストラクターはconnection_stringのみを設定します)。

using (SqlConnection connection = new SqlConnection(connection_string)) {
 connection.Open(); ...
}

接続プールのため、実際には1つの接続のみが使用されますが、上記の「using」行が複数のメソッドに配置されている場合(たとえば、次々に呼び出される場合)、正しいですか?ただし、これにより、1つだけが必要なSQLConnectionインスタンスが多数作成されませんか?例えば:

MyClass obj(some_string);
obj.Method1(); // calls 'using SqlConnection connection = new SqlConnection'
obj.Method2(); // calls 'using SqlConnection connection = new SqlConnection'
obj.Method3(); // calls 'using SqlConnection connection = new SqlConnection'

では、SQLConnectionを共有するための適切で最適な方法は何でしょうか。

4

1 に答える 1

5

あなたはすべての発言について正しいです。ただし、重要な点が1つ欠けています。.NETでタイプのインスタンスを多数作成することは、必ずしも悪いことではありません

  • コンストラクターで単一の接続インスタンスを作成しないでください
  • 必要に応じて、ローカルで接続を作成する必要があります
  • 使い捨てオブジェクトを作成するときにパラダイムを使用することをお勧めしますusing
  • ブロック内の使い捨てオブジェクトでDisposeを呼び出す習慣をつける必要があります(使用していない場合)-特定のシナリオが;の使用にうまく適合しない場合に備えて。たとえば、非同期メソッドを使用します)try...finallusingusings
  • 最後に、SQL接続を必要以上に開いたままにしないでください繰り返しになりますが、SQLServer用のADO.NETプロバイダーの接続プールを利用するだけです。

さて、接続タイプのインスタンスをたくさん作成することが問題にならない理由は、.NET CLRでのオブジェクトの作成が最適化され(高速なメモリ割り当てとオブジェクトのインスタンス化)、比較的苦痛がないためです(ガベージコレクション).. ADO.NETプロバイダーの場合、接続プーリングの利点もあるため、このタイプのインスタンスの数を管理する必要はありません。

他の場合(重い/大きなオブジェクトなど)にそれらを大量に作成すると、メモリの負荷とパフォーマンスに影響を与える可能性があることは明らかです。したがって、常に状況を可能な限り評価します。

于 2013-01-30T16:31:28.540 に答える