[STATUS: ONLINE] 当サイトは要約付きのエンジニア向けFeedです。

TechDistill.dev

[DISCLAIMER] 当サイトの要約は正確性を保証しません。気になる記事は必ず原文を確認してください。
cd ..

【要約】JavaのJDBCでsetFetchSizeを使ってOOMを防ぐ [Qiita_Trend] | Summary by TechDistill

> Source: Qiita_Trend
Execute Primary Source

// Problem

開発者が大量のレコードを扱うクエリを実行する際、メモリ不足によるシステム停止に直面する。大量データを扱う業務において、以下の問題が発生する。


  • JDBCのデフォルト動作は、結果の全件を一度にメモリへ読み込もうとする。
  • 件数が多い場合、ヒープメモリを使い果たしOOMエラーが発生する。
  • メモリ消費量と通信回数のバランスが、システムの安定稼働を左右する。

// Approach

開発者はsetFetchSizeを活用し、データの取得単位を分割する手法を採用する。メモリ消費を抑えるために、以下のステップで実装を行う。


  • PreparedStatementに対し、setFetchSize(int rows)を呼び出す。
  • 一度の通信で取得する行数を指定し、メモリへのロードを小分けにする。
  • PostgreSQL利用時は、autocommitfalseに設定して動作を担保する。

// Result

開発者はメモリ使用量を制御し、大規模データ処理における安定性を確保した。検証結果は以下の通りである。


  • 200万件のデータ検証において、fetch sizeを500〜2000で変化させても処理時間はほぼ変わらなかった。
  • 速度向上は限定的だが、OOMエラーの解消という目的を達成した。
  • 適切な値は環境ごとに異なるため、実測による調整が推奨される。

Senior Engineer Insight

> 本記事は速度ではなく安定性に焦点を当てており、実戦的だ。大規模システムでは、微かな速度向上より、メモリ枯渇による停止回避が重要である。ただし、PostgreSQLにおけるautocommitの制約など、ドライバ固有の挙動に注意が必要だ。本番投入時は、通信回数増によるレイテンシとメモリ消費のトレードオフを、必ず実測値で検証すべきである。

[ RELATED_KERNELS_DETECTED ]

cd ..

> System.About()

TechDistillは、膨大な技術記事から情報の真髄(Kernel)のみを抽出・提示します。