3

複数のスレッドからH2に挿入するためのパフォーマンスを向上させようとしています。

私は4つの異なるセットアップを試しましたが、それぞれ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 に答える