2

次のデータベースがあります。

CREATE TABLE person_bornYear (name, year INT, prob FLOAT);

そして、人物要素を含むオブジェクト (PersonYear) を持つベクトルがあります: String name、int year、double prob。

ベクトル要素をデータベースに 1 行ずつ挿入しようとしています。

private Statement _stat;
private Connection _conn;
private PreparedStatement _prep;
for (PersonYear py : vecToInsert) {
    this.set_prep(this.get_conn().prepareStatement("INSERT into person_bornYear values (?, ?, ?);"));
    this.get_prep().setString(1, py.get_person());
    this.get_prep().setString(2, Integer.toString(py.get_year()));
    this.get_prep().setString(3, Double.toString(py.get_accuracy()));
    this.get_prep().executeUpdate();
}

2 ~ 3 分かかります (ベクターには 100K の要素が含まれます)。

ベクター要素をDBに挿入するより速い方法を教えてもらえますか?

前もって感謝します。

4

3 に答える 3

2

ここの例のように、単純なバッチクエリを正確に実行できます: http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/

于 2013-03-03T16:40:36.413 に答える
1

コードを大幅に高速化する 2 つの簡単な方法:

  1. 反復ごとに準備済みステートメントを再作成しないでください。これはかなりコストのかかる操作であり、返されるオブジェクトは再利用可能です。
  2. 準備済みステートメントへの複数の呼び出しをバッチ処理して、データベースに対する呼び出しの数を減らすことができます

このコードはテストされていません。必要に応じて変更してください。

this.set_prep(this.get_conn().prepareStatement("INSERT into person_bornYear values (?, ?, ?);"));
for (PersonYear py : vecToInsert) {
    this.get_prep().setString(1, py.get_person());
    this.get_prep().setString(2, Integer.toString(py.get_year()));
    this.get_prep().setString(3, Double.toString(py.get_accuracy()));
    this.get_prep().addBatch();
}

this.get_prep.executeBatch();
于 2013-02-13T12:45:06.327 に答える
0

まず、すべての反復を通じて同じプリペアドステートメントをインスタンス化します。代わりに、ループの前にインスタンス化してから再利用すると、おそらくある程度の速度が得られます。

次に、大量の操作を同時に実行しているため、代わりに一括挿入を使用できます。JDBCを使用してバッチINSERTを実行する効率的な方法

このようなもの:

PreparedStatement stmt = this.get_conn().prepareStatement("...");
for (...) { 
  ... 
  stmt.addBatch();
  stmt.clearParameters();
}
stmt.executeBatch();

第三に:なぜそれらをそれほど速く挿入することがそれほど重要なのですか?ソフトウェアがデータに依存していない場合は、スレッドを使用して行うことを検討できます。これにより、データベースがベクターデータを噛みしめている間、プライマリアプリケーションを続行できます。

データベースのバックエンドによっては、ベクターを分割して、データを異なるスレッドに同時に挿入することもできます。バックエンドに適切なMVCCがある場合は、多くの時間を節約できます。

于 2013-02-13T12:46:40.723 に答える