0

大規模な Oracle データベースからの結果セットから CSV/Excel スプレッドシートを生成するための機能要件を持つ Spring の Web アプリケーションがあります。予想される行数は 300,000 ~ 1,000,000 の範囲です。処理時間は、アプリケーションの安定性を維持するほど大きな問題ではありません。現在、結果セットが非常に大きいと、メモリ不足とクラッシュが発生します。

このような通常の状況では、ページネーションを使用して、UI に一度に表示される結果の数を制限します。ただし、この場合、オフラインで使用するために、そのサイズに関係なく、セット全体を 1 つのファイルで作成できる必要があります。

結果セットをオブジェクトに変換するために使用されている ParameterizedRowMapper に問題を切り分けました。

この操作を制御するには、どのような手法を使用できますか? ページネーションはまだオプションですか?

4

4 に答える 4

1

簡単な答え:

JDBCレコードセット(または適切な配列/フェッチサイズの同様のもの)を使用して、一時的またはデータベースにデータをLOBに書き戻します。

別の選択肢:

データベースでPL/SQLを使用して、レコードセットのUTL_FILEを使用してCSV形式でファイルを書き込みます。ファイルはクライアントではなくデータベースサーバー上にあるため、Javaストアドプロシージャを使用してUTL_SMTPまたはJavaMailを使用してファイルをメール送信します。結局のところ、100万行のレコードセットが生成されるのを待って砂時計がひっくり返るのを誰かが繰り返し見ているとしたら、私は驚きます。

于 2010-08-25T17:20:23.357 に答える
1

ファイル全体をメモリにロードする代わりに、各行を個別に処理し、出力ストリームを使用して出力をWebブラウザに直接送信できます。たとえば、サーブレットAPIでは、ServletResponse.getOutputStream()から出力ストリームを取得し、そのストリームに結果のCSV行を書き込むだけです。

于 2010-08-25T17:59:54.057 に答える
0

私はそれらの要件を押し返します-それらはかなり人工的に聞こえます. アプリケーションに障害が発生したり、ユーザーがそのデータを見る前に電源が切れたりした場合はどうなりますか?

上記のコメントから、答えを知っているように聞こえます-仕事をするためには、ファイルシステムまたはオラクルへのアクセスが必要です。

SQLで再現できないデータを生成するように求められていますか? 繰り返し可能な場合は、一度に数ページのデータをユーザーに送り返すだけです。

このレポートは、データの現在の状態に関係していると思われるため、ユーザーにストリーミングできない場合は、その結果をどこかに保存する必要があります。私はオラクルでストアド プロシージャを作成します。ネットワーク経由でデータを送受信しない方がはるかに高速です。特別なツールがある場合、またはそれが簡単な場合は、代わりに Java 側で実行しても問題ないように思えます。

このレポートを週に 1 回実行するようにスケジュールできますか?

于 2010-08-25T18:37:13.920 に答える
0

1,000,000 行の Excel スプレッドシートのパフォーマンスを考慮したことがありますか?

于 2010-08-25T19:02:18.580 に答える