最近Springベースでシステムを作っていて、JDBCTemplateを使ったOracleへのアクセスをしている。その中で、件数が多い(といっても5000件程度)データをSELECTすると処理が遅くなって、ハマった。
環境
・ JDK8
・SpringFramework 4
・ORACLE 11g
処理イメージと解決方法
fetchsizeを指定するのがポイント。JavaConfigでnewするときに設定してもダメで、結局直前で指定するようにした。
どうやらOracleのJDBCのデフォルトが10らしく、大量の行をにSELECTしようとすると遅くなるようだ。そのため、フェッチサイズを多めに指定してあげることで解決となった。
https://www.oracle.com/technetwork/topics/memory.pdf
事前にデータ件数が多くなることが分かっていれば、適宜fetchsizeを上げておく必要がありそうだ。だが、fetchsizeは闇雲に上げればいいというものでもないので、実際はプロパティファイルにフェッチサイズを指定し、状況が変わってもアプリを修正することなく最適なサイズを指定できるようにしている。
参考としたサイト
最後に
ハマると時間を無駄に消費するけれど、この経験はどこかに残さないと同じ轍を踏みそうなので記録。JDBCTemplateに頼った開発ではなく、Spring Data JPAを使った開発に今後していく予定。そこはそこでハマったらまた何か書く予定。
今日はここまで。
関連記事