複数のスレッドからH2に挿入するためのパフォーマンスを向上させようとしています。
私は4つの異なるセットアップを試しましたが、それぞれ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
どういうわけかスレッドの競合を減らすことは可能ですか?
PS:
- 生成されたキーを取得することは重要です。
- H2を別の組み込みデータベースに切り替えることもできます。ただし、回答はH2に焦点を当てる必要があります。