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が実行されているということになります。これではリソースも無駄遣いですし、トランザクション制御も大変なので、どうにかして同一コネクションで実行させないといけまません。それは次回!