大量データを扱うときの注意点
データベースでログのような巨大化しやすいデータを扱う場合、以下の点で注意が必要となる。
1.メモリの蒸発
2.パフォーマンスの低下
1.メモリの蒸発
a.DBから引っ張るとき
MySQLはデフォルトだと検索結果をすべてメモリに乗せてしまい、
この件数が非常に多ければ当然メモリを圧迫してOut of Memoryを引き起こします。
よって、まずは一度にメモリに乗せる量を減らす必要があります。
データベースにはフェッチサイズというものがあり、この数値を変更することで一度にメモリに乗せる量を変更することができます。
例えば、フェッチサイズを50にした場合、一度に乗せる件数は50件となります。
一度のフェッチで足りない場合、それだけ問い合わせ回数が増えるため、極端に小さい数字にするとパフォーマンスの低下につながります。ただし、大きければいいというわけでもなく、最適値は扱うデータ量よって変化するため、ここは想定されるデータ量に合わせて調整する必要があります。
b.出力するまで
DBからの検索結果を出力する際、一旦リストに詰めてからまとめて出力する方法と、検索結果をサーブレットのレスポンスに順次書き出していく方法があります。
結論から言うと後者の方法が正しいやり方です。
具体的にはResultSetの繰り返し処理内でそのまま書き出します。Mybatisを使っている場合はResultHandlerを使えば実装可能です。
2.パフォーマンスの低下
単純にSelectするだけだと数秒かかってしまうことがあります。こういった状況を回避する手段として、
特定のデータを絞り込みでやる場合はインデックスを活用する。
ページングの関係でリミットをかけて検索する場合はプライマリキーを利用する。
などSQL文を改善することでパフォーマンスを向上することができます。