パフォーマンス確認

簡単にパフォーマンスチェックをしてみます。
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();
}