2011-01-15 8 views
0

SqlConnectionオブジェクトの使用に関する適切な使用法または適切な設計に関する意見が必要です。以下のうち2つのうちどれが最適ですか:.NETでのSqlConnectionの適切な使用

メソッドが(それぞれに)SqlConnectionオブジェクトを含む(完了したときに破棄される)データプロバイダクラス。同様に:

IList<Employee> GetAllEmployees() 
{ 
    using (SqlConnection connection = new SqlConnection(this.connectionString)) { 
    // Code goes here... 
    } 
} 

Employee GetEmployee(int id) 
{ 
    using (SqlConnection connection = new SqlConnection(this.connectionString)) { 
    // Code goes here... 
    } 
} 

または

SqlConnection connection; // initialized in constructor 
IList<Employee> GetAllEmployees() 
{ 
    this.TryOpenConnection(); // tries to open member SqlConnection instance 
    // Code goes here... 
    this.CloseConnection(); 
    // return 
} 

Employee GetEmployee(int id) 
{ 
    this.TryOpenConnection(); // tries to open member SqlConnection instance 
    // Code goes here... 
    this.CloseConnection(); 
    // return 
} 

それともこれよりも良いアプローチはありますか?私は集中型Webクローラー型のアプリケーションを持っており、このアプリケーションは、クローラー・オブジェクトに含まれる各Webサイトで50以上のWebサイトを同時に(マルチスレッドで)クロールし、各クローラー・オブジェクトにはデータ・プロバイダー・クラス(上記)のインスタンスがあります。

+1

ところで、これはC#とは関係ありません。 'SqlConnection'は.NETの一部であり、C#の一部ではありません。 –

+0

私はC#を置くことで、他の人に自分のコードサンプルがC#であることを知らせると考えました。とにかく、ありがとう。 – Jojo

+0

これはC#タグのためのものです。さらに、コードを見る人は誰でもC#を見ることができます。 –

答えて

5

実際のデータベース接続はプールされます。すべてのSqlConnectionインスタンスが同じ接続文字列を使用する限り、それらはすべて実際に同じ接続を使用します。

接続インスタンスを作成して使用してから、それを廃棄してください(usingブロック内)。こうすることで、コードを変更して別の接続文字列を使用する必要がある場合、トランザクションを使用する場合など、その変更をすぐに利用できるようにする必要があります。

+0

100を超えるWebサイトがクロールされてデータベースにアクセスする場合(これは単なるデータベースですが、各Webサイトは1つのテーブルに関連しています)、100を超える接続が可能である可能性がありますプールサイズのデフォルト?)。なぜなら、私は怠け者だからです。( – Jojo

+0

@Jojo:これは100回の接続ではなく、わずか100回のSqlConnectionインスタンスであり、おそらく1回の接続でしかありません。 、秒を最適化します。 –

0

実際には関係ないかもしれませんが、接続オブジェクトをクラスインスタンスレベルに分ける唯一の時間は、それぞれのメソッドが何をしているのかを明確に分離したい場合です。おそらく長すぎますいくつかの部分にリファクタリングする必要があり、それぞれはトランザクションの一部として同じ接続で操作する必要があります。

I.e.

そうでなければ、私はかなりオプション1に固執しています。接続プールは、基本的には何も費用がかかりません。