3

我正在尝试从多个线程在 H2 上插入时获得更好的性能。

我尝试了四种不同的设置,每一种都有 20 个并发线程进行插入:

  1. 共享连接;
  2. 共享连接禁用自动提交;
  3. 连接池;
  4. 连接池禁用自动提交。

使用选项 4 获得最佳结果:

H2 线程争用

创建的表:

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

是否有可能以某种方式减少线程争用?

PS:

  • 获取生成的密钥很重要。
  • 将 H2 切换到另一个嵌入式数据库可能是一种选择;但是,请,答案应该集中在 H2 上。
4

1 回答 1

3

我们使用了多版本并发控制多线程选项。它们似乎确实有助于解决一些争用问题,但它们并不是灵丹妙药。

于 2012-10-03T15:02:28.933 回答