9

Sql Server 2000データベースを使用してC#で記述されたASP.netアプリケーションに取り組んでいます。クライアントがビジネスニーズに使用するPDFレポートがいくつかあります。問題は、これらのレポートの生成に時間がかかることです(> 3分)。通常、ユーザーがレポートを要求すると、Webサーバーがレポートの生成を完了する前に、要求のタイムアウトによって要求が強制終了されるため、ユーザーはファイルをダウンロードする機会がありません。次に、ユーザーはページを更新して再試行します。これにより、レポート生成プロセス全体が最初からやり直され、タイムアウトになります。(いいえ、現在レポートをキャッシュしていません。それは私が強く求めていることです...)。

これらのシナリオをどのように処理しますか?私の頭の中には、レポートの生成を開始するための非同期リクエストを作成し、その後、定期的にステータスをチェックするためのJavaScriptを用意するというアイデアがあります。ステータスがレポートの終了を示したら、実際のファイルに対して別のリクエストを行います。

私が見ていないもっと簡単な方法はありますか?

4

6 に答える 6

5

ここでファイルシステムを使用することは、おそらく良い賭けです。レポート PDF の場所への URL をすぐに返すリクエストを行います。その後、サーバーは外部プロセスを開始するか、サーバー自体にリクエストを送信してレポートを実行できます。クライアントは、提供された URL の PDF についてサーバーを (http HEAD を使用して) ポーリングできます。PDF のファイル名をレポート パラメーターから派生させると、ハッシュを使用するか、パラメーターを名前に直接入れることで、サーバー側のインスタント キャッシュも得られます。

于 2008-10-01T13:38:41.250 に答える
4

処理の観点から、このレポートをもう少しオフラインにすることを検討します。

レポート要求を入れるキューを作成するように、そこからレポートを処理し、終了後にユーザーにメッセージを送信できます。

キュー処理用に別の Windows サービスを作成することもあるでしょう。

更新:ユーザーへの送信は電子メールで行うか、「レポート」ページを使用して、レポートのステータスを確認し、準備ができている場合はダウンロードできます。

于 2008-10-01T13:36:40.817 に答える
2

クエリの調整は、おそらく開始するのに最適な場所です。あなたがレポートを作成していることはわかりませんが、そのステップはそれほど長くはかからないはずです。一方、パフォーマンスの低いクエリは、パフォーマンスを完全に損なう可能性があります。

クエリの内容によっては、インデックスを追加したり、レポートの情報を非正規化された方法で保存するためのテーブルを設定したりして、レポートをより速く利用できるようにする必要があります。この非正規化されたテーブルは、1時間ごとに、または要件に応じた頻度で(理由の範囲内で)更新できます(SQL Serverジョブを介して)。

ユーザー入力パラメーターを変更せずに比較的静的なレポートである場合は、その日の早い時間に実行されたレポートをキャッシュすることも良い考えですが、状況を知らずにこれについてこれ以上言うことは困難です。

このような問題の場合、レポート生成コードが原因であると疑う理由がない限り、データベースから開始する必要があります。しばらくの間役立つ可能性のあるさまざまなバンドエイドがありますが、データベースが根本的な原因である場合、それらのソリューションは適切に拡張できず、将来的に同様の問題(またはさらに悪い問題)が発生する可能性があります。

于 2008-10-01T14:34:13.893 に答える
2

ユーザーはこのアプローチを受け入れないかもしれませんが、次のようになります。

ユーザーが (ボタンやリンクなどをクリックして) レポートを要求すると、別のスレッドでレポート生成プロセスを開始し、ユーザーを「ありがとうございます。レポートは電子メールで送信されます」というページにリダイレクトできます。あなたは数分で」。

スレッドがレポートの生成を完了したら、PDF を直接電子メールで送信するか (サイズが原因で機能しない可能性があります)、レポートをサーバーに保存してリンクをユーザーに電子メールで送信できます。

または、IIS でタイムアウトを 3 分以上に引き上げることもできます。

于 2008-10-01T13:38:29.580 に答える
2

レポートをユーザーに電子メールで送信するのはどうですか。ASP ページが行う必要があるのは、レポートを生成する要求を送信し、実行が終了した後にレポートが電子メールで送信されるというメッセージを返すことだけです。

于 2008-10-01T13:34:37.687 に答える
2

この問題が提示された場合に私が行うことのいくつかを次に示します。

1- それらのタイムアウトを停止します。それらは資源の完全な浪費です。(aspページのタイムアウト値を表示します)

2- すべてのデータベース アクセスを 1 つのポイントに集中させ、次に、どのレポートがいつ、誰によって、どのくらいの時間で実行されたかに関する統計を収集します。レポートが複雑なためか、時間がかかる理由を調べてください。データ範囲?サーバー負荷?(実際には、サーバー上の .csv ファイルにすべて書き込み、このファイルを SQL サーバーに定期的にインポートして、後で分析することができます)。

最終的には、この単一のアクセス ポイントを通過すると、レポートを「キャッシュ」する方が簡単になります (たとえば、同じクエリを同じ日付で実行すると、以前に生成されたものと同じ PDF が返されます)。

3- これが問題ではないことはわかっていますが、これらのクエリを詳しく調べて、実行に時間がかかる理由を確認しましたか? おそらくクエリのチューニング?

4- レポートの準備ができたときの電子メール/SMS/画面上のメッセージは素晴らしいようです... ユーザーが一般的に生成されるレポートのバッチを送信する場合、「自分の」キューの進行状況を示す小さなダッシュボードをアプリに組み込むことができます。ちょっとした ajax コントロールは、定期的にステータスを更新します.. ヒント: 中央データベースへのアクセスを使用し、いつ、なぜ、どのくらい実行するかについて十分な情報を持っている場合、最終的にレポートにかかる時間を大まかに見積もることができます。走る。

応答時間がミッション クリティカルである場合、特定のユーザーを 1 日の特定の時間帯にデータ範囲 (たとえば、日付範囲) に制限する必要がありますか?

頑張ってください。より正確なヒントが必要な場合は、シナリオの詳細を投稿してください...

于 2008-10-01T13:58:03.310 に答える