6

さて、私はしばらくASP.NETプロジェクトに取り組んできましたが、プロジェクトが含まれるデータの点でどんどん大きくなっているので、私を悩ませているいくつかの悪いデザインの選択をしたようです。

.NETメモリ管理について読んだ後、私は潜在的な理由のすべてのセットを特定したと思います。私がやっていることは特に特別なことではないので、私がやりたいことを達成するための標準的なパターンが欠けているのではないかと思います。

したがって、1から20000の結果を生成する(やや高価なクエリ)があります。以降のリクエストでは、結果セットをページングしている可能性があるため、この結果をセッションに保存します。セッションはInProcです。不思議なんだけど:

  • a)結果を保存するb)セッションにc)処理中に保存することは理にかなっていますか?(a)の速度が欲しいです。ユーザーが保存するよりも効率的な方法があるかどうか(b)、より洗練された状態サーバーを使用する場合は、遅くなりませんか(c)?または、セッションが期限切れになるまで最後の結果セットをRAMに保持するのではなく、これらの大きなオブジェクトをより迅速に破棄するという解決策でしょうか?

  • 〜20000行を超える結果セットがLOHを台無しにする可能性がある場合、それを回避する一般的な方法はありますか?

私はこの質問が少し過小評価されていることを知っています。全体的な設計に欠陥がある可能性があることに気づきました(スケーラビリティーに関して)。そして、どれだけ欠陥があるかを正確に見積もろうとしています。それにもかかわらず、これを一般的に有用な質問に変える標準パターンに関するいくつかのヒントが収集されることを願っています。

4

3 に答える 3

1

クエリが何であるかはわかりませんが、一度にユーザーに表示する必要があるよりも多くの行をデータベースから取得するのはなぜですか?優れたインデックスを使用すると、後続のページをすばやくプルアップできるはずです。そうすれば、それらのページが必要な場合にのみそれを実行できます。

別の方法は、20000アイテムの結果セットのIDを保存することです。そうすれば、ページをめくる必要がある場合に、主キーを使用して個々の行をすばやくプルアップできます。

最後に、SessionではなくCacheオブジェクトを使用して結果を保存することを検討する必要があります。そうすれば、オブジェクトをいつ破棄するかを.NETに決定させることができ、セッションが肥大化することはありません。

于 2011-05-19T14:16:07.420 に答える
1

結果をセッションに保存しないようにする必要があります。ユーザーが同じセッションで複数のブラウザタブを使用している場合、アプリケーションがうまく機能しない可能性があります(発生します)。

セッションを使用する場合は、InProcモードを絶対に使用しないでください。ユーザーが成長すると、プロセスがメモリを消費し、最終的にはリサイクルされ、タイムアウトが経過していなくてもユーザーのセッションが失われます。

Keltexが言及したように、データベースでページングしてみてください。表示しているデータのみをプルします。

于 2011-05-19T14:28:43.513 に答える
1

なぜ常にすべてのレコードを返すのですか?クエリを高速化する最善の方法は、ユーザーに必要なデータのみを返すことだと思います。したがって、ページに収まるデータのみを返します。

ROW_NUMBER()(SQL Server)またはLIMIT(mySQL)をグーグルで検索してみてください。

これが2つの商品チュートリアルです

1)ScottGuのブログ

2)15秒のチュートリアル

于 2011-05-19T14:40:09.200 に答える