2

Spring のバッチ挿入に関していくつか質問があります。

私がそのようなことをするとき:

public void save(Car car) {
  String sql1 = "insert into Car values (1, 'toyota')";
  String sql2 = "insert into Car values (2, 'chrysler')";
  String sql3 = "insert into Car values (3, 'infinity')";

  String[] tab = new String[2];
  tab[0] = sql1;
  tab[1] = sql2;
  tab[2] = sql3;

  getJdbcTemplate().update(sql1);
  getJdbcTemplate().update(sql2);
  getJdbcTemplate().update(sql3);

  // getJdbcTemplate().batchUpdate(tab);
}

mysqlログファイルに次のように表示されます:

1  Query       insert into Car values (1, 'toyota')
2  Query       insert into Car values (2, 'chrysler')
3  Query       insert into Car values (3, 'infinity')

したがって、3 つの挿入ステートメント (および 3 つのネットワーク呼び出し) があります。

ログファイルで使用するgetJdbcTemplate().batchUpdate(tab)と、次のことがわかります。

1094 [main] DEBUG org.springframework.jdbc.core.JdbcTemplate - 3文のSQL一括更新を実行 1110 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - DataSourceからJDBC接続を取得 1110 [main] DEBUG org.springframework .jdbc.datasource.DriverManagerDataSource - [jdbc:mysql://localhost:3306/test?useServerPrepStmts=true] 1610 への新しい JDBC DriverManager 接続の作成 [main] DEBUG org.springframework.jdbc.support.JdbcUtils - JDBC ドライバーはバッチ更新をサポートします

そしてmysqlログで:

1  Query       insert into Car values (1, 'toyota')
1  Query       insert into Car values (2, 'chrysler')
1  Query       insert into Car values (3, 'infinity')

バックグラウンドでaddBatchメソッドがステートメントオブジェクトで呼び出され、これらすべての操作が同時に実行されることを理解しています。追加の利点は、ネットワーク コールの削減です。私の推論は正しいですか?

HibernateTemplate で似たようなものを探しています。私はこのようにそれを行うことができます:

  getHibernateTemplate().saveOrUpdateAll(Arrays.asList(new Car(4, "infinity"), new Car(5, "ford")));

その場合、ログ ファイルに次の内容が表示されます。

3  Prepare     select car_.id, car_.name as name0_ from Car car_ where car_.id=?
3  Prepare     select car_.id, car_.name as name0_ from Car car_ where car_.id=?
3  Prepare     insert into Car (name, id) values (?, ?)

したがって、 getJdbcTemplate().updateBatch(...) の場合と同様に、すべてが一発で行われるようです。

私が間違っている場合は、私を修正してください。

4

1 に答える 1

3

Hibernate(準備されたステートメントを使用)と同様の結果を生成するには、を使用する必要がありますJdbcTemplate.batchUpdate(String, BatchPreparedStatementSetter)。このようなもの:

final List<Car> cars = Arrays.asList(...);

getJdbcTemplate().batchUpdate("insert into Car (name, id) values (?, ?);",
    new BatchPreparedStatementSetter() {
        private int i = 0;
        public int getBatchSize() { return cars.size(); }
        public void setValues(PreparedStatement ps) {
            ps.setString(1, cars.get(i).getName());
            ps.setInt(2, cars.get(i).getId());
            i++;
        }
    });
于 2010-02-27T15:47:46.960 に答える