【问题标题】:Reducing Thread contention on H2减少 H2 上的线程争用
【发布时间】:2012-10-03 14:57:05
【问题描述】:

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

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

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

使用选项 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 上。

【问题讨论】:

    标签: java h2


    【解决方案1】:

    我们使用了Multi-version Concurrency controlMulti-threaded 选项。它们似乎确实有助于解决一些争用问题,但它们并不是灵丹妙药。

    【讨论】:

    • 我已经在使用 MVCC。将连接字符串添加到问题中。
    • 您是否尝试过使用多线程选项? h2database.com/html/grammar.html#set_multi_threaded
    • 这就是我在回答中提出的建议
    • 我认为您的回答是正确的,因为这似乎是减少线程争用的最佳选择。
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2011-02-04
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2021-10-15
    相关资源
    最近更新 更多