- PR -

O/Rマッピングと大量レコードの検索について

1
投稿者投稿内容
POTETO
常連さん
会議室デビュー日: 2003/10/06
投稿数: 41
投稿日時: 2006-04-19 22:14
お世話になります。

HibernateやTorqueのようなO/Rマッピングを利用した場合、
大量レコードの検索を行うと、OutOfMemoryで異常終了する場合があります。
画面の場合は、出力制限を設けることやページング処理で
回避できますが、CSVファイルへの出力などの場合、
出力レコード数に制限を設けたくない場合が多いです。
(伝送関連の問題はありますが)
「画面で制限掛けるんならダウンロード機能が欲しい。」
とか、良く言われます。

こういった場合、ファイル出力処理にはO/Rマッピングを
利用せずに、JDBC直実装でフェッチしながらファイルに出力する
といった方法をとるしか思いつきません。

皆さんはどのような実装をされているでしょうか。

実装方法を聞くというのは恐れ多いですが、
ご教授の程宜しくお願いします。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-04-19 23:50
正直に毎度毎度作らずにバッチあたりで作っておいてそれをDLしてもらうとか?
アティ
ベテラン
会議室デビュー日: 2003/08/14
投稿数: 91
お住まい・勤務地: KANAGAWA
投稿日時: 2006-04-26 12:41
実際に実装したわけではないですが、iBATISの場合queryForPagenatedListメソッドを使用するといいかもしれないです。
ページ単位で、レコードの取得を行っているようなのでうまくいくかもしれません。
ハイネマン
会議室デビュー日: 2006/03/15
投稿数: 10
投稿日時: 2006-04-26 15:39
Hibernateにも,開始行&終了行を指定して結果を得る方法がありますので,
数回に分けて取得する方法を考えてみては?
holic
ベテラン
会議室デビュー日: 2004/08/24
投稿数: 74
投稿日時: 2006-04-26 16:13
このへんをご参考に。
http://www.hibernate.org/hib_docs/v3/reference/en/html/batch.html

キャッシュがメモリを無駄使いするのを防ぐことが必要です。
session.flush() の後に、session.clear() しておきましょう。

使ったことないですが、StatelessSession を使う手もありますね。本質的には、JDBC 直接呼出しとあんまり変わらないかもしれませんが。
1

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