テーブルに 170 万件のレコードがある MySQL データベースを使用しています。Java の Restlet フレームワークを使用して、これらのレコードを取得し、クライアントに返したいと考えています。リモートサーバーであるLinux Centosを使用しています。WAR ファイルを作成し、サーバーにアップロードしました。サービスを実行すると、応答に時間がかかります。40分待ったが何も出力されなかった。誰でもこの問題を解決するのを手伝ってもらえますか?
3 に答える
それはおそらくうまくいかないでしょう: メモリ内に多くの行のデータを保持すると、メモリ不足の例外が発生する可能性があります (サーバーのログを見て、正確に何が起こっているかを確認できますか?)。
このようなことを行うには、その計画を放棄して何らかのページネーションを行うか、レコードをメモリに保持せずにクライアントにストリーミングできるソリューションが必要になります。Restlet フレームワークでそれができるかどうかはわかりません。おそらく、サーブレットを使用して自分で実装する必要があるでしょう。
私は自分のアプリでこの種の作業を成功させました。クライアントが大きな反応を受け入れる準備ができている場合、このアプローチに問題はありません。要点は、応答をストリーミングする必要があるということです。つまり、応答全体を文字列として作成することはできません。HTTP 応答の出力ストリームを取得し、レコードを 1 つずつ書き込みます。db-end では、スクロール可能な結果セットを設定する必要があります (Hibernate レベルだけでなく、JDBC レベルでも簡単に実行できます)。
非常に多数の行がある場合、メモリ マップド ファイルを使用しました。たとえば、1 分ほどで 11 億行を取得して処理しなければならないデータベースが 1 つあります。(200GB以上あります)
これは非常に専門的なアプローチであり、SQL データベースを調整する方法や、NoSQL データベースを使用して目的を達成する方法があると思います。何をしているかにもよりますが、1分以内に170万を取得できます(たとえば、数TBの中でこれを選択する場合、しばらく時間がかかります)
ただし、他に選択肢がない場合は、カスタム データ ストアを作成できます。
ところで: 要約のみが生成されます。多くの行を読み取ることは期待されるべきではありません。ブラウザに表示することは絶対に避けてください。おそらく、レポートや要約を作成するために何かできることがあるので、クライアントに送信する必要はありません。