2010-12-07 12 views
0

私のアプリケーションでは、同じSQLを使って1秒ごとにデータベースを照会しています。私はどのような対策をとるべきかを知る必要があります。プールから接続を取得する前に " タイムアウト時間が経過した"などの問題が発生しますか?またはそれのような他の?データベースに連続的に問い合わせています。何か問題があるのでしょうか?

現在、私は毎秒新しい接続を作成し、使用後にそれを破棄しています。この場合、接続を再利用する必要があります。

ベストセラーアプローチは何ですか?

+0

あなたはその理由を教えてもらえますか?クエリの実行に1秒以上かかる場合、大きな問題に終わることがあります。 – darioo

答えて

1

IMHOのベストプラクティスは、できるだけ早く接続をポンプとダンプすることです。必要なものにアクセスしてすぐに閉じることができます。パフォーマンス志向の敵は、接続を作成するために必要なオーバーヘッドではありません(そこにはいくつかの関係がありますが)。データベースにテーブルをロックしています。

アプリケーションを最適化するには、検索のたびにデータベースを往復する必要がないようなキャッシュメカニズムを実装する必要があります。それはパフォーマンス面でのメリットです。

もう1つのことは、読み取り専用接続を使用できることです。従来のものよりもオーバーヘッドが少なく、パフォーマンスも向上します。

+0

キャッシングはここでの解決策ではありません。すべての旅行で常にその新しいデータ。 – Faisal

+0

ところで、私はどのように読み取り専用データベース接続を作成できますか? – Faisal

+0

それを行う本当の唯一の方法は、DataReaderを使用することです - http://msdn.microsoft.com/en-us/library/aa720705(v=VS.71).aspx - 読み取り専用で、転送専用ですそれははるかにパフォーマンスが良いです。さらに、遅延実行を使用するので、必要に応じて、同じDataReaderを1秒に1回押してデータベースから最新のデータを取り出すことができます。 – Aaronontheweb

0

なぜこれを行う必要がありますか?

データベースの負荷を軽減するためにデータをキャッシュすることができます。あなたは1秒前、または5秒後のデータが必要ですか?

使用するたびに接続を終了することは問題ありません。それは本当に閉鎖されていません、それはちょうど接続プールに戻ります。

+0

キャッシュは私の場合は解決策ではありません。すべてのデータベースクエリでは、ここで新しい結果セットが必要です。 – Faisal

+0

しかし、質問はなぜですか?誰かがあなたの問題をより良く解決できるかもしれません。 – TalentTuner

+0

当社のサーバーにアップロードされている文書が多数あり、そのレコードがデータベースに保存されています。私たちは毎秒データベースにクエリを出して新しい文書を見つけ出し、そのメタ情報に従って各文書(フィルタリングや名前の変更など)を処理するサービスを持っています。最後にデータベースレコードを更新します。 – Faisal

0

あなたが使用しているライブラリが実際にあなたのために接続をプールしている場合は、違いはありません。そうでない場合は、同じ接続を複数回使用する方がよいでしょう。接続の作成には時間がかかります。

いくつかの質問...

  • あなたは、データベースからどのようなデータを得ていますか?
  • そのデータをアプリケーションメモリに保存できますか?
+0

なぜダウン投票? – jgauffin

0

あなたは、このような接続を処分する場合には、そのようなアプローチに問題はありません。

using (SqlConnection cnn = new SqlConnection(ConnectionString)) 
{ 
      SqlCommand cmd = new SqlCommand(commandText, cnn) 
      { 
       CommandType = CommandType.Text 
      }; 

      DataSet ds = new DataSet(); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      da.Fill(ds); 

      return ds; 
} 

唯一の問題は起こるかもしれません - ハードウェアがenought良くない場合は、あなたのデシベルのパフォーマンスを低下しています。

1

必ず接続を開いて閉じてください。実際に、接続の最後の使用後にusingブロックに多くのコードがある場合は、できるだけ早くプールに戻すにはClose()に電話してください。そうすれば、まったく新しい接続を開く必要がない別の使用の可能性が減ります(実際の接続が開かれたときとプールから取り出されたときの詳細については、What does "opening a connection" actually mean?を参照してください)。

これは、「1回/秒」の平均が異なるスレッド間で、またはすべてがそのスレッドでですか? 1つのスレッド上にあれば問題ありませんが、実際には少しでもの方が接続オブジェクトを開いたままにする方が速いかもしれません。どちらの方法でも競合が起こらないからです。

キャッシュの結果をリフレッシュする必要があるときに、メモリ使用の不利な点があるにもかかわらず、キャッシュ結果を確認することは間違いありません。実際には何をしているのかによって些細なものから不可能なものがあります。

また、最適化するときに余分に移動するクエリもあります。

関連する問題