2012-02-06 14 views
4

SQL Serverデータベースとやりとりし、データを取得してからXML応答を返すasp.net Webページがあります。 xml_curlを使用してFreeswitchにフィードしてください)。(データベースとやり取りする)ページへの複数のセッションレスリクエストにより、HTTPエラー500が発生する

Freeswitch(以降FS)はCookieを保存しないため、各要求によって新しいセッションが作成されます。

要求の数が(約97〜100)が多すぎるを取得すると、SqlConnection.Open()メソッドは、その後、私の仮説をテストするにはHTTPエラーで500

を結果SQL Serverインスタンスからのタイムアウトを取得私は、PHPとcURLを使用して小さなスクリプトを作成しました。これは、asp.netページに繰り返し要求を出します。 PHPスクリプトにクッキー(したがってセッション)を保存すると、約314秒で10000回の成功したリクエストを作成できます。

しかし、セッションのない

は、私は約97〜100の要求にはまり、その後、私はHTTPエラー500

は、この問題を克服するために、とにかくあり得ますか?

==編集==
は、ここで私はデータベースと対話する方法です。このコードをimpoveする

ID => int, identity, primary key 
Name => nvarchar(255), unique 
XMLContent => ntext 
+0

どのようにデータベースを呼び出していますか?不要になったときに接続を終了していますか?接続プーリングを無効にしましたか?データベースにアクセスするコードを投稿した場合に役立ちます。また、実行したSQL文をチェックして、データベース内でブロックしないようにする必要があります。 BTW ASP.NETセッションは、データベースへのアクセスとは何の関係もありません。セッションを開始するときに接続を開き、セッションを閉じるときに閉じるなど、2つをバインドするコードが追加されている場合を除きます。 –

+0

私はコードを追加しました。そして、私が言ったように、私はクッキー(とセッション)を格納する場合、コードは10000要求を実行します。 –

+4

さて、文字列連結の代わりにパラメータを使用してSQLインジェクションを避けたいと思うでしょう。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx –

答えて

3

尋ねました。デフォルトでは、これらのプールにはSQLサーバーへの最大100の接続があり、追加の接続を待ち行列に入れます。キューにはタイムアウトが設定されています(デフォルトは15秒です)。これは、サーバーにバックアップされる可能性があることを意味します。 SQLサーバーで処理できる場合は、プールの最大サイズを大きくすることもできます。ここで

はあなたの接続設定を増やす方法ですby adding these parameters:

  • タイムアウト= 60
  • 最大プールサイズ= 150
  • などなど
+0

ありがとうございました。 'Pooling = false'で接続プーリングを無効にしました(この接続文字列を使用するページは1つしかないので問題ありません)。問題が解決しました。 –

+0

シナリオでは、1つのページでプーリングを使用すると、1)アプリケーションがSQLに対して使用している接続の量を制限します(したがって、SQLサーバーを固定しません)。2)SQLサーバーへの接続を多く作成するもっと早く。これは、SQL文が10msで実行されていても、接続に300msかかる場合に顕著になります。いずれにせよ、あなたのために働くことがうれしいです。 –

1

いくつかのステップ:

String connectionString = WebConfigurationManager.ConnectionStrings["SqlServerConnection"].ConnectionString; 
SqlConnection connection = new SqlConnection(connectionString); 
SqlCommand command = connection.CreateCommand(); 
command.CommandType = CommandType.Text; 
command.CommandText = "Select * from dbo.Template where Name = '" + name + "'"; 

Template template = new Template(); 

connection.Open(); 

SqlDataReader reader = command.ExecuteReader(); 


if (reader.HasRows) 
{ 
    reader.Read(); 
    template.Name = reader["Name"].ToString(); 
    template.XMLContent = reader["XMLContent"].ToString(); 
} 
else 
{ 
    template.Name = ""; 
    template.XMLContent = ""; 
} 

reader.Close(); 
connection.Close(); 

return template; 

とテンプレートの表では、これらのフィールドがあります。

  1. セッションが不要な場合は、このページで無効にして、クッキーを作成しないようにします。
  2. nameの一部のキャッシュを使用します。nameの要求が同じ場合は、キャッシュから取得してデータベースを開きません。
  3. 接続文字列を一度だけ読み取るには静的変数を使用します。
  4. [try catch |あなたが失敗した場合に接続を閉じるようにするには
  5. あまりにも多くのリクエストを避けるために、ミューテックスロックロジックを試してみてください。
  6. SQL呼び出しでパラメータを使用します。 @Aristosの提案に加えて
+0

素晴らしいヒント! –

関連する問題