减少H2上的线程争用

时间:2012-10-03 14:57:05

标签: java h2

我正试图在多线程的H2上实现更好的性能。

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

  1. 共享连接;
  2. 共享连接禁用自动提交;
  3. 连接池;
  4. 连接池禁用自动提交。
  5. 选项4获得最佳结果:

    H2 Thread Contention

    使用以下方式创建的表:

    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
    

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

    P.S:

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

1 个答案:

答案 0 :(得分:3)

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