2012-03-21 4 views
1

.NET Remotingを使用するクライアントサーバーアプリケーションがあります。
私は、アプリケーションDBQueryのサーバー部分にヘルパークラスを持っています。
DBQueryはDatabaseConnectionとSQLCommandオブジェクトCommanderを保持し、渡されたクエリを実行します。.NET Remotingサーバーアプリケーションでデータベース接続オブジェクトを静的にする必要があります

クエリが実行されるたびに、Commanderが開いている接続を確認します。
(必要に応じてCommanderを再作成します)

私はDBConnectionを静的にする必要がありますか? は

電流特性は、以下に定義された(のDBConnectionはコマンダ、DBConnection.CreateCommand()作成):

/// <summary> connection used for querying with </summary> 
public DBConn DBConnection 
{ get { return _conn ?? (_conn = new DBConn()); } } 

/// <summary> Command object for processing the queries </summary> 
private SqlCommand Commander 
{ 
    get 
    { 
     return _commander ?? 
      (_commander = DBConnection.Connection.CreateCommand()); 
    } 
} 

DBConnからSqlConnectionをラップし、インフラが接続を行っている

答えて

1

それは静的だとしても、決しては、単一の接続を使用する - 私は、接続がスレッドセーフであるとは考えていないので、それは必ずしも異なる2から並列に呼び出されるまで親切に反映されません一つのことのためにクライアント。

もし私が間違っていても(と私はまだ複数のスレッド間で1つの接続を共有しません)、データベースサーバで何か起こったら、それが再起動されるか、 (サポートチームによってアップグレードがリリースされたため)、接続が切断され、再度開くことができなくなります。サービス/アプリケーションを再起動する必要があります。実際に次回試してみると例外が発生する可能性があります。

また、どこで接続を処理しますか?常に信頼できるとは限らないシャットダウンイベントにフックする作業を行わない限り、静的オブジェクトを破棄することは非常に困難です。 AppDomainのシャットダウンに依存して、あなたのために物事を処分するだけでは、良い習慣ではありません。

必要なときに接続を作成し、接続が完了したら処分します。あなたが最も簡単な用語で、与えられたコードに基づいて: - そのよう

using(var conn = new DbConn().Connection) 
{ 
    SqlCommand command = conn.CreateCommand(); 
    /* query and get results here */ 
} 

現実にはあなたがそれでのConnection基礎となるDispose方法にDbConnクラスIDisposableとチェーンがIDisposable.Disposeの実装のようにしたいかもしれませんが、あなたは

using(var dbconn = new DbConn()) 
{ 
    //now you can use dbconn.Connection knowing that it will be disposed of 
} 

注を行うことができます - それはちょうどDispose()がオブジェクトで呼び出されることを保証します - new DbConn()は、ファクトリメソッドやプロパティのgetに置き換えている場合usingブロックはまだ動作しますブロックが終了したとき、および例外が発生したときでも。

このようにすれば、私の答えの前半で強調したすべての問題を回避できます。

+0

ですが、それはそれ自身の接続を使用するすべての単一のクエリではありませんか?私はむしろDB接続自体を人生のDBQueryに結びつけたいと思います。(そのようにして、複数のクエリに対して1つの接続を再利用することができます。)しかし、DBQueryのすべての用途を '使用する 'ブロック? – Raystorm

+0

このようにコードを記述する場合にのみ、複数のクエリに対して同じ接続を再利用することは何もありません。 '使用する 'ことを回避する必要性については、なぜあなたはしたいですか?それは慣例の問題ではなく、オブジェクト*を正しく使うことの問題です。 LinqからSQl、Entity Framework、そして他のORMを見てください。ほとんどの場合、 'using'パターンを使用する必要があります。なぜなら、データベースと対話する正しい方法だからです。正しい処分は単なる賢明なものではありません。サーバ自体はあなたがそれを完了したことを知る必要があるので、別のDBの他のクライアントにサービスすることができます –

+0

分かりやすいコマンドオブジェクトのためにIDisposableも実装します。 –

0

をApp.configファイルから、適切な接続情報を供給する。私の推薦では、静的にしないことでコードをきれいに保つことができます。

関連する問題