SQL Object API と Fluent API の融合 その1

まずは前回の Dao001.java を使用して、単純に2つのAPI形式で実行してみましょう

Sample002.java
public static void main(String[] args) {
	String url = "jdbc:postgresql://192.168.52.128/jdbi";
	DBI dbi = new DBI(url, "jdbi_user", "jdbi_pass");
	Dao001 dao = dbi.open(Dao001.class); // ※1

	dao.createTable();
	dao.insert("Sample-Dao1-Name");
	String name = dao.findNameById(1);
	System.out.println("name(Object API) = " + name);

	Handle h = dbi.open(); // ※2
	name = h.createQuery("select name from table001 where id = :id")
			.bind("id", 1)
			.map(StringMapper.FIRST)
			.first();
	System.out.println("name(Fluent API) = " + name);

	dao.close(); // ※3
	h.close(); // ※4
}

一見上手くいっているように見えますが、実は落とし穴があるのです。
コメントに※1〜4とありますが、そこでブレークポイントを仕掛けてデバッガで1行ずつ実行していきましょう。その際、postgresユーザでDBにも接続して、以下のSQLを実行して接続状況を同時に確認していきます。

SELECT * FROM pg_stat_activity;
  • ※1実行直後
    • コネクション+1
  • ※2実行直後
    • コネクション+1
  • ※3実行直後
    • コネクション-1。※1 で接続したコネクションが閉じられた
  • ※4実行直後
    • コネクション-1。※2 で接続したコネクションが閉じられた

つまり、別々のコネクションで実行しているため、別トランザクションSQLが実行されているということになります。これではリソースも無駄遣いですし、トランザクション制御も大変なので、どうにかして同一コネクションで実行させないといけまません。それは次回!