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(...) の場合と同様に、すべてが一発で行われるようです。
私が間違っている場合は、私を修正してください。