- PR -

Webサービスに対する同時リクエストの問題

1
投稿者投稿内容
るいるい
常連さん
会議室デビュー日: 2004/08/01
投稿数: 21
投稿日時: 2005-04-03 01:51
Webサービスの開発をしていますが、クライアントから同時に複数のリクエストを受けた場合に、不具合が発生して大変困っています。
プログラムは、一部省略しますが以下のようになります。

01: [WebMethod]
02: public string SampleMethod(string clientID)
03: {
04:  DataSet ds = new DataSet();
05:   (データ取得処理 〜省略します)
06:  DataView dv = ds.DefaultView;
07:  string filter = "ClientID=" + clientID;
08:  dv.RowFilter = filter
09:
10:  (dv を使った処理 〜省略します)
11:
12: if ( !dv.RowFilter.Equals(filter)
13:   Deubug.WriteLine("Error"!")
14:
15: (以下、省略します)
14: }

この処理に対して、同時にリクエストを投げると、想定外の動きをしたり、エラーが発生したりします。どうやら、8行目で設定したRowFilter条件が、それ以後の処理で他のリクエストのRowFilter条件になっていました。
そこで念のため、12〜13行目の処理を追加したのですが、条件を満たして、13行目を処理してしまいます。

おそらくこれはマルチスレッドにおける問題?と思います。とはいえ、いろいろなサンプルを見ますが、特にそのような考慮をしているものも見かけません。
クライアントからの要求毎に、インスタンスを生成するのか、あるいはマルチスレッドとして動作するのか、などイマイチ概念を理解していなかったのがいけないのですが...。

皆さんはこのような現象が発生した事はないでしょうか。また、何かこの件に対する対策など、何でも構いませんので情報を頂ければ助かります。

これにあわせ、Webサービス(Webアプリケーション)のリクエストに対して、サーバー側のインスタンスとスレッドの関連について、情報がありましたらあわせてご教授いただけると幸いです。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-04-03 11:13
そんなことがおきちゃうのですか。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwebhttpapplicationstateclasslocktopic.asp
これは役に立ちますでしょうか。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-03 16:44
引用:

るいるいさんの書き込み (2005-04-03 01:51) より:

06:  DataView dv = ds.DefaultView;


ここ、コンパイルが通らないと思いますけど?

 インスタンスの怪しいところはここだけなので、DefaultViewManagerを使わず、ViewManagerの新規インスタンスを生成するようにしてみてはどうでしょう?
_________________
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-04-03 18:03
提示されていないコードで、Applicationオブジェクトを使ってたりしてない?

_________________
たつごろー
codeseek
こみゅぷらす
るいるい
常連さん
会議室デビュー日: 2004/08/01
投稿数: 21
投稿日時: 2005-04-07 17:47
皆様、いろいろとご指示いただいてたのに、返信が遅れすみません。

たつごろーさんのおっしゃる通り、実は Application オブジェクトを使用していました。サンプルで掲載したソースコードでは複雑になるので省略していたのですが、DBへアクセスしてDataSet を取得するクラスを使っていました。

このクラスでは、アクセス頻度の高いデータは、Application オブジェクトに DataSet を格納し、2度目以降にリクエストでは、この DataSet の参照を戻していました。

ですので、結果的に複数のリクエストがあると、それぞれのリクエストで同一の DataSet を参照していたので、Filter 条件がおかしくなっても当然でした。

この独自のキャッシュもどきの処理をやめたら、まったく問題なく動作するようになりました。

皆様のおかげで大変助かりました。
今後もよろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)