パフォーマンス確認
簡単にパフォーマンスチェックをしてみます。
id、name を持つテーブルに1万件insertしてみました。
特に意外な結果にはならなかったので、問題ないかなと思います。結果はソース中にコメントで書いておきました
Dao019.java
public interface Dao019 { @SqlUpdate("insert into table001 (id, name) values (:id, :name)") int insert(@Bind("id") int i, @Bind("name") String name); @SqlBatch(value = "insert into table001 (id, name) values (:id, :name)", transactional = false) int[] insertBatch(@Bind("id") List<Integer> ids, @Bind("name") List<String> names); void close(); }
Sample029.java
private static final int SIZE = 10000; private static DBI dbi = null; private static List<Integer> idList = new ArrayList<>(); private static List<String> nameList = new ArrayList<>(); private static Date d = null; private static String tag = null; private static void start(String tag) { d = new Date(); Sample029.tag = tag; } private static void stop() { long time = new Date().getTime() - d.getTime(); System.out.println( String.format("%s : %,.2f[s]", tag, time/1000D) ); } private static void truncate() { dbi.withHandle(new HandleCallback<Void>() { @Override public Void withHandle(Handle handle) throws Exception { handle.execute("truncate table table001"); return null; } }); } public static void main(String[] args) { String url = "jdbc:postgresql://192.168.52.128/jdbi"; dbi = new DBI(url, "jdbi_user", "jdbi_pass"); for( int i=0; i<SIZE; ++i ) { idList.add(i); nameList.add("name"+i); } handleExecute(); // 9.89[s] handleInsert(); // 6.59[s] handleCreateBatch(); // 0.47[s] handlePrepareBatch(); // 0.69[s] // daoOnDemandInsert(); // さすがに毎回Open-CloseするonDemandでは計測不能 daoOpenCloseInsert(); // 7.33[s] daoBatch(); // 0.36[s] } private static void handleExecute() { truncate(); dbi.withHandle(new HandleCallback<Void>() { @Override public Void withHandle(Handle handle) throws Exception { start("handleExecute"); for(int i=0; i<SIZE; ++i ) { String sql = String.format( "insert into table001(id, name) values(%d,'%s')", idList.get(i), nameList.get(i) ); handle.execute(sql); } stop(); return null; } }); } private static void handleInsert() { truncate(); dbi.withHandle(new HandleCallback<Void>() { @Override public Void withHandle(Handle handle) throws Exception { String sql = "insert into table001(id, name) values(?,?)"; start("handleInsert"); for(int i=0; i<SIZE; ++i ) { handle.insert(sql, idList.get(i), nameList.get(i)); } stop(); return null; } }); } private static void handleCreateBatch() { truncate(); dbi.withHandle(new HandleCallback<Void>() { @Override public Void withHandle(Handle handle) throws Exception { Batch batch = handle.createBatch(); start("handleCreateBatch"); for(int i=0; i<SIZE; ++i ) { String sql = String.format( "insert into table001(id, name) values(%d,'%s')", idList.get(i), nameList.get(i) ); batch.add(sql); } batch.execute(); stop(); return null; } }); } private static void handlePrepareBatch() { truncate(); dbi.withHandle(new HandleCallback<Void>() { @Override public Void withHandle(Handle handle) throws Exception { String sql = "insert into table001(id, name) values(?,?)"; PreparedBatch b = handle.prepareBatch(sql); start("handlePrepareBatch"); for(int i=0; i<SIZE; ++i ) { b.add(idList.get(i), nameList.get(i)); } b.execute(); stop(); return null; } }); } private static void daoOnDemandInsert() { truncate(); Dao019 dao = dbi.onDemand(Dao019.class); start("daoOnDemandInsert"); for( int i=0; i<SIZE; ++i ) { dao.insert(idList.get(i), nameList.get(i)); } stop(); } private static void daoOpenCloseInsert() { truncate(); Dao019 dao = dbi.open(Dao019.class); start("daoOpenCloseInsert"); for( int i=0; i<SIZE; ++i ) { dao.insert(idList.get(i), nameList.get(i)); } stop(); dao.close(); } private static void daoBatch() { truncate(); Dao019 dao = dbi.onDemand(Dao019.class); start("daoBatch"); dao.insertBatch(idList, nameList); stop(); }