必要な時だけコネクションを張る
ObjectAPI形式だけを使用する場合、DBI.onDemand で勝手にopen、closeしてくれます。
Dao002.java
public interface Dao002 { @SqlUpdate("create table IF NOT EXISTS table002 (id int primary key, name varchar(100))") void createTable(); @SqlUpdate("insert into table002 (id, name) values ((select count(*)+1 from table002), :name)") void insert(@Bind("name") String name); @SqlQuery("select name from table002 where id = :id") String findNameById(@Bind("id") int id); void close(); }
Sample007.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 dao001 = dbi.onDemand(Dao001.class); dao001.createTable(); dao001.insert("dao001"); Dao002 dao002 = dbi.onDemand(Dao002.class); dao002.createTable(); dao002.insert("dao002"); }
デバッガで1行ずつ実行しながらコネクションの接続状況を確認すると、どこで止めてもコネクションが確認できません。実は、SQLを実行する直前に接続して、実行直後にすぐ切断してみるみたいです。
SqlObject.java の174行目「ding.retain(method.toString());」でコネクションを作成し、そのfinally節で「ding.release(method.toString());」として切断してます(実際のコードはまだもう少し先の処理ですが)。
トランザクションが必要無ければこれでもいいでしょうけど、エラー時は rollback するのが必須ですから、ある限定的な場合においてはコードがキレイになっていいけど、あんまり使いどころが無いような気がします