hatora's blog

日常の出来事や仕事のことなど/Java/開発/Web/IT

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
- 問題なし


リソースの後処理はしっかりとしましょう!!