なぜConnectionインターフェースだけをcloseするのか?
最近こいつを読んでDBアクセスを勉強しています。
多くの入門書において、多くのオブジェクトがclose()メソッドで閉じられているのを良く見かけます。
Connectionインターフェース、Statementインターフェース、ResultSetインターフェースは
必ずclose()されている入門書が多いように感じています。
とある人方は「プログラマーのマナーや」といっていたので、
「マナーなので明示的にclose()処理をするのか・・・」と思っていました。
Connectionは再度使用するためにclose()処理をすると・・・・。
dameプログラマーなので安易にそう思っていました。
すると、最近勉強中の本で以下のようなコードがあったので
紹介したいと思います。
尚、著作権の問題もありますので、一部改造しています。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class DameSelect { /** * @param args */ public static void main(String[] args) { String url = "jdbc:mysql://localhost/test"; Connection con = null; try { String driver = "org.gjt.mm.mysql.Driver"; Class.forName(driver).newInstance(); } catch (Exception e) { System.out.println("Driverロードの失敗"); return; } try { con = DriverManager.getConnection(url, "damePG", ""); Statement select = con.createStatement(); ResultSet result = select.executeQuery("SELECT * FROM USER"); while (result.next()) { int key; String value; key = result.getInt(1); if (result.wasNull()) { key = -1; } value = result.getString(2); if (result.wasNull()) { value = null; } System.out.println("key = " + key); System.out.println("value = " + value); } } catch (Exception e) { e.printStackTrace(); } finally { if (con != null) { try { con.close(); } catch (Exception e) { e.printStackTrace(); } } } } }
いまさら驚きもありあせんが、簡単なDBアクセスです。
ただ、ResultSetとStatementインターフェースはclose()処理していません。
ここで新発見があったので書いておきます。
Connectionを閉じると、暗黙的にそのConnectionに関連する全てのStatementインスタンスが閉じられる。
同様にStatementを閉じると、暗黙的にそのStatementに関連する全てのResultSetインスタンスが閉じられる。
理屈がわかれば多様してみようと思います。
皆既日食よりDBアクセスの方が好きなdamePGでした。