2012-04-17 4 views
4

私は現在、私たちのクライアントのためにいくつかのWebサービスに取り組んでいます。それらを利用可能にする前に、非常に大量のデータが返される可能性があるため、データベース呼び出しのパフォーマンスを最適化したいと考えています。 (何百万ものオブジェクトが存在する可能性があり、各オブジェクトには約12個の他のオブジェクトのリストが含まれている可能性があります)ASP.net Webサービスから大量のデータを返す際の良い習慣は何ですか?

私たちはサーバーに負担をかけることなく、不必要にWebサービスを制限したくありません。

「データ:Webサービスメソッドの

一つは、私は、データの量が設定量よりも大きくして返された場合は、のようなものを言ってメッセージを返すことを考えていた、指定した日付範囲内のすべてのデータを返します。大きすぎます、期間を減らしてください "

そのようなユーザーの範囲を制限するのは良いアイデアですか?

クライアントが一度に取得できるデータ量を制限する必要がありますが、可能な限り便利な状態に保ちます。つまり、プログラマでもありますので、単純すぎる必要はありませんが、使用するには単純です。

大量のデータをWebサービスを通じて返すことに関する良い慣行は何ですか?

ありがとうございます!

+0

何十万という何千もの正確に?ギガバイト、文字列、ブール値?そしてあなたは間違いなく.NETでMySqlを使用していますか? – Widor

+0

申し訳ありませんが、私は明らかにすべきです。何万ものオブジェクト。各オブジェクトには、おそらく12個の異なるテーブルのレコードのリストが含まれています。どのような種類のデータ型、たいていは文字列を正確に言うのは難しいです。 – PaulG

+0

サービスにisSuccessful booleanとエラーコード(またはテキスト)を持つResponseオブジェクトが返されるようにします。消費者はトランザクションの成功をチェックすることができ、エラーコードをオンにして次に何をすべきかを決定することができます。返されるレコードを制限することはお勧めしません。これはデータセットに基づいているため、日付範囲のような一貫性があるため、常に結果を返すことがわかります。 –

答えて

4

あなたがリストに表示されたページングデータの一般的な手法を適応することができるかもしれませんかグリッド。データベースの呼び出しによって、返されるレコード数とページ番号が指定されます。

たとえば、ページに10個のレコードが表示されている場合は、10個のレコードしか表示されません。レコード1 - 10(または、好きな場合は0 - 9)が1ページ目に、11 - 20ページ目2などに返されます。

また、利用可能なレコードの合計数が返されることがあります。

このようにして、ユーザーは多数のレコードをスクロールし続けることができます。また、検索条件を絞り込んでより小さい結果セットを得ることもできます。

ページングまたはチャンクのWebサービスを使用することができます。 Webサービスコールは、各チャンクで送信されるレコード数と「ページ」または「チャンク」番号を提供します。 Webサービスは、利用可能なレコードの総数とともに、要求されたレコードを返します。

この方法では、Webサービスを使用している開発者は引き続き制御されます。

呼び出しコードをループ内に配置して、その動作が望ましい場合にチャンクを要求し続けることができます。誰かが本当にレコードのトラックローディングを望むなら、レコード数を非常に大きな数に設定することができます(またはオプションのパラメータにして、null、ゼロ、空の場合はすべてを返します)。

1

Webサービス用に潜在的に多くのデータのように聞こえます。

しかし、ここでは、データの受信/「大」のボリュームを送信するためにサーバーをセットアップについて語っMSDNからのページです:http://msdn.microsoft.com/en-us/library/aa528822.aspx

0

(1000 obj)のような時間単位のデータを与えることができます。開始インデックスとデータ量を指定する必要があり、データを取得するために使用します。 SQLには、これを簡単に行うことができるTAKEとSkipがあります。

2

本当にあなたのニーズによって異なります。これは私にとってコーディングの質問よりも設計上の問題のようですが、我々のシステムでは2つのアプローチがあります。私はそれらを共有して、考慮すべきいくつかのアイデアを提供します。

  • 最初は、私たちがデータを提供しています。顧客は取引データを自分のアカウントでダウンロードすることができます。また、一部の顧客にとっては、これはかなり大量のデータになる可能性があります。 X日分のデータに制限しており、これで問題はありません。

  • 第2のものでは、車両の位置データおよびその他の運航者や管理者にとって興味のあるデータを追跡する、確立されたベンダーのWebサービスからデータを消費しています。私たちの艦隊内のすべてのトラックは、その地理的位置の定期的な更新に加え、他のデータ(ブレークのロード/アンロード/ドライバなど)これらのWebサービスで

    • 、我々は日付の範囲を要求し、サービスが設定された制限値を返しますを与えますレコード数(1件あたり1000レコード)。
    • 日付範囲を渡すことに加えて、「位置」整数フィールドを渡します。最初の呼び出しでは、「位置」はゼロに設定されます。
    • Webサービスは、「More Data Exists」ブール値フィールドを返します。
    • "More Data Exists" = trueの場合、 "position"パラメータがインクリメントされた状態でWebサービスを再度呼び出し、 "More Data Exists" = false(コード中の単純なループ)

私は最初のプログラマーかエンドユーザーのどちらにとっても素晴らしいと思います。プログラマを扱うときは、2番目はうまく動作します。

+0

お返事ありがとうございます。私はあなたが言及した第二のアプローチが好きです。しかし、それがクライアント側でちょうどループされているなら、それは本当に私たちのサーバー上の負荷をどれだけ減らしていますか? – PaulG

+0

私のプログラムが捕捉されたデータを解析する間、そしてそれが次のバッチになる前に、一時的な休止があることを除いて、それはそうではありません。これにより、他のコールがサーバー間で入り込むためにサーバーが解放されます。 – David

関連する問題