- PR -

DB検索結果のクライアントへのダウンロードについて

1
投稿者投稿内容
POTETO
常連さん
会議室デビュー日: 2003/10/06
投稿数: 41
投稿日時: 2004-02-28 13:09
皆さん、こんにちは。
jdk1.3 + Struts1.1という環境です。

DBの検索結果をCSVファイルなどでクライアントにダウンロードしたいのですが、
どのような手順が実用的なのでしょうか?
1 : ResultSetより1レコード読み込む度にレスポンスのoutputStreamへ出力する。
2 : ResultSetより1レコード読み込む度に一時ファイルへ出力し、
  一時ファイルをクライアントへダウンロードする。
3 : 検索結果をメモリ上にバッファしておき検索処理終了後にバッファ情報を
  クライアントへダウンロードする。

上記3つしか思いつかなかったのですが、一般的にはどのような手法をとるのでしょうか。
「1」は、検索処理の異常終了時にすでにoutputStreamへ出力しているデータがどうなるのか分からない(勉強不足ですが)為怖いです。
「2」は、レスポンスが悪そうなのと、異常終了時のファイルガベージを考えるのがめんどくさそうです。
「3」は、数万レコードあった場合にOutOfMemoryExeptionが発生しそうです。

ご教授の程宜しく御願い致します。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2004-02-28 14:11
方法と問題点はきちんと把握されているようですので、私見を述べさせていただきます。

バッファリングして一括でダウンロードする場合でも、通信路の障害とか、ファイルにバッファリングする場合はバッファ中のハードディスク障害とか、厳密を期するとキリがありません。
個人的な考えですが、性能がシビアでなければファイルにバッファして DB からのデータ取得とクライアントへの送信でトランザクションを分割する方法をとります。
取得容量がそれほど大きくなく、シビアな性能を求められる場合はメモリ上にバッファですね。
ファイルガベージの廃棄だけなら、Java の場合は finally 句でスマートに処理できるのであまり重要視しなくても良いと思います。
トランザクション分割を推すのは、異常時に原因がデータ取得にあるのか、クライアントへの送信にあるのか、問題箇所を特定しやすくするためです。

性能と取得容量を両立させたい場合ですが、この時はトランザクションを分割せず、処理が成功したら最後に成功メッセージを送信、クライアント側ではそのメッセージが受信できなかったら受信データを廃棄というプロトコルを設計するのがいいように思います。
1

スキルアップ/キャリアアップ(JOB@IT)