2009-08-23 21 views
2

ASP.NET Webサービスから静的メソッドを呼び出す際に落とし穴があるかどうかを知りたいと思います。ASMXから静的メソッドを呼び出す落とし穴

internal static object SelectScalar(String commandText, DataBaseEnum dataBase) 
    { 
     SqlConnection sqlc = new SqlConnection(AuthDbConnection.GetDatabaseConnectionString()); 
     object returnval=null; 
     if (sqlc!=null) 
     { 
      SqlCommand sqlcmd = sqlc.CreateCommand(); 
      sqlcmd.CommandText = commandText; 
      sqlc.Open(); 
      returnval = sqlcmd.ExecuteScalar(); 
     } 
     return returnval; 
    } 

したがって、上記の方法の場合、複数のWebメソッドとこのメソッドを同時に呼び出す複数のクライアントには落とし穴がありますか(たとえば、この関数を呼び出すWebメソッドへの1000回の呼び出し)?

答えて

3

新しいSqlConnectionを作成しているので、それを破棄したい場合、接続が終了しません。使用上のガイドラインについては、MSDNを参照してください。

共有ステート(グローバル変数)を更新していないので、その静的メソッドは問題ではないようです。

EDIT:AFAIK、Webサービスの静的メソッドの「落とし穴」は他のアプリケーションと同じです。メモを保持する唯一のことは、Webサービスが長期間信頼性をもって動作することが期待されるサーバーであることです。したがって、時間が経つにつれて問題を引き起こす可能性のあるもの(メモリリーク、データベース接続の枯渇など)は、はるかに短い期間実行される他のアプリケーションよりも重要です。

+0

ええと...私はスレッドセーフであること以外にコードの他の側面を見ていたはずです。 +1してください。 –

+0

この小さなスニペットを編集しました。私たちは接続を閉じます。 – choudeshell

3

注意すべき点は、静的メンバーが、アプリケーションドメイン内の他のスレッドからアクセス可能な状態を変更する場合です。このような場合は、秩序ある方法で適切な対策を講じなければなりません。

あなたのメソッドはそれ自身から状態を変更することはありません(すべてがローカルです)。 duffymoとして


とネーダーは、あなたがIDisposableインターを実装する任意のオブジェクトを破棄して下さい必要がありますよう、あなたの接続を処分する必要があり、指摘しました。

3

C#がJavaに似ているかどうかわかりませんが、SQL接続を開いてメソッドを終了する前に閉じないと、私にとっては良い考えには見えません。 GCは範囲外になったらそれをクリーンアップしますが、これはJavaで接続を閉じることと同じではありません。

Javaのイディオムでは、finallyブロックで接続を閉じることを要求します。あなたがC#クラスがそのようなことを必要としていないことが確かでない限り、私はそれを調べます。

すぐにわかるでしょう - 何千ものウェブ通話が不足している場合、すぐに利用可能な接続の数が使い果たされます。

もう1つ点を確認してください。このように接続を開くと、Javaでコストがかかるため、通常はプールされます。接続プールもC#で行われていますか?データベース接続を開いたり閉じたりするのは非効率的ですか?静的な共有接続で同じことを達成できますか?そのようにすれば、おそらくスレッドの問題が発生します。

+0

接続でdisposeを呼び出す必要があると書いてあります。 +1してください。 –

+0

@duffymo:はい、プールできます。 http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.71).aspx –

+0

を参照してください申し訳ありません。ちょっとしたスニペットをコピーして編集しました。はい - 接続を閉じ、接続プーリングを使用します。どのタイプの落とし穴があるのか​​分かりません。我々は、このタイプのパラダイムを多くの場所で使用しています。 – choudeshell

関連する問題