2011-06-27 7 views
2

私はサーバーとクライアントを持っています。 Serverは、WCFサービスをホストするWebアプリケーションです。サーバーは、最初のアクセス時に初期化され、決して(私のコードで)破棄されないスタティックシングルトンを介してLinq2SQL DataContextを使用します。クライアントはWCF経由でサーバーへの呼び出しを行い、データベースからいくつかの情報を照会して更新を行います。複数のクライアントが同時にサーバーにアクセスするまでは、すべて正常に動作します。それが起こると、サーバーは別の例外をスローします。LINQ To SQLは、リーダーが閉じているときにReadを呼び出す無効な試みを示します。

リーダーが閉じているときに読み込みを無効にしようとしました。

このコマンドに関連付けられている開いているDataReaderが既にあります。このDataReaderは、最初に閉じる必要があります。

私が知る限り、私は静的なシングルトンを使用していて、何らかの形でクライアント接続を共有していますが、主な目的はデータベースへの接続量を最小限に抑えることでした。

どうしてですか?

答えて

3

Linq to SQL DataContextはスレッドセーフではありません(MSDN参照)。通常、DataContextは個別の作業単位に対してインスタンス化する必要があります。あなたはコードを変更してWeb要求ごとにインスタンス化し、要求の終わりにコードを閉じるようにすることができます。そうすれば大丈夫でしょう。

1

シングルトンとは、アプリケーション/プロセスごとに1つのインスタンスしか存在しないことを意味します。 asp.netアプリケーションは同じプロセスを使用してすべての要求を処理しますが、それぞれ独自のスレッドを持ちます。したがって、すべての要求で同じコンテキストインスタンスを共有しています。単純な答えは、データコンテキストのためのシングルトンパターンを使用しないでください、これは絶対に間違ったことです。

+1

サポートコメントの一種として、DataContextは「作業ユニット」に使用されることを意図しています。 http://stackoverflow.com/questions/4735498/singleton-pattern-for-data-context – Peter

+0

を参照してください。@Patricker Ermはい、私が作成していたポイントのようなものでした。 –

+0

スレッドごとに単一のdatacontextを使用することは、各作業単位ごとに単一のdatacontextを使用することとは大きく異なります。差別化が行われたことを確認しようとしています。 – Peter

1

接続の管理について心配する必要はありません.Netはプールして再利用します。

文を使用してdbコンテキストをラップすると、すべて設定されます。

極端なボリュームとクエリがない限り、これを最適化する必要はありません。