【发布时间】:2012-10-03 14:57:05
【问题描述】:
我正在尝试通过多线程在 H2 上插入获得更好的性能。
我尝试了四种不同的设置,每一种都有 20 个并发线程进行插入:
- 共享连接;
- 共享连接禁用自动提交;
- 连接池;
- 连接池禁用自动提交。
使用选项 4 获得最佳结果:
创建的表:
create table foo (id int not null auto_increment primary key, name varchar(50))
插入代码(c 是来自org.h2.jdbcx.JdbcConnectionPool 的连接):
private static void insertDataWithConnection(Connection c, String n) throws SQLException {
c.setAutoCommit(false);
PreparedStatement ps = c.prepareStatement("insert into foo (name) values (?)");
ps.setString(1, n);
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
rs.next();
rs.getInt(1);
rs.close();
c.commit();
c.setAutoCommit(true);
ps.close();
}
连接字符串:
jdbc:h2:test;AUTOCOMMIT=OFF;WRITE_DELAY=300;MVCC=TRUE;LOCK_MODE=0;FILE_LOCK=SOCKET
是否有可能以某种方式减少线程争用?
附:
- 获取生成的密钥很重要。
- 将 H2 切换到另一个嵌入式数据库可能是一种选择;但是,请注意,答案应该集中在 H2 上。
【问题讨论】: