ResultSetとStatement
ある新規追加したバッチで、件数が多いとOut Of Memoryがでるってあったので原因を探ったらこんな感じだった。
for (int i = 0; i < 1000000; i++) { PreparedStatement stmt1 = conn.prepareStatement("SELECT NAME FROM PERSON"); ResultSet result = stmt.executeQuery(); }
原因はforループで、closeせずにPreparedStatementを使い回していたことが原因。
ちょっと調べてみました。
conn.prepareStatementはSingletonではない。
System.out.println(conn1.prepareStatement("SELECT NAME FROM PERSON").toString()); System.out.println(conn1.prepareStatement("SELECT NAME FROM PERSON").toString());
結果
org.sqlite.PrepStmt@33d65cd0 org.sqlite.PrepStmt@3e677646
close処理に関しても調べてみました。
※ ループ処理 && jconsoleでヒープダンプを確認
- ResultSetのみclose
- Statementのみclose
ResultSetのみclose
- Out Of Memory発生
Statementのみclose
- 問題なし
リソースの後処理はしっかりとしましょう!!