Oracle 11gを使用しています。私は3つのテーブル(A,B,C
)を私のデータベースに持っていますA <one-many> B <many-one> C
私は、最初にA
とC
に、その後B
に3つの挿入を実行するコードを持っています。このコードは何度も実行され(200000
)、各テーブルに200000
の挿入操作が行われます。Spring jdbcTemplateとPreparedStatement。パフォーマンスの差
私は挿入を行うには二つの方法があります:私はための実行時間を測定し
List<String> bulkLoadRegistrationSql = new ArrayList<String>(20);
for (int i=1; i<= total; i++) {
// 1. Define sql parameters p1,p2,p,3p4,p5
// 2. Prepare sql using parameters from 1
String sql1String = ...
String sql2String = ...
String sql3String = ...
bulkLoadRegistrationSql.add(sql1String);
bulkLoadRegistrationSql.add(sql2String);
bulkLoadRegistrationSql.add(sql3String);
if (i % 20 == 0) {
jdbcTemplate.batchUpdate(bulkLoadRegistrationSql
.toArray(new String[bulkLoadRegistrationSql.size()]));
//Clear inserted batch
bulkLoadRegistrationSql = new ArrayList<String>(20);
}
}
:
JDBCのPreparedStatement:
DataSource ds = jdbcTemplate.getDataSource(); try (Connection connection = ds.getConnection(); PreparedStatement statement = connection.prepareStatement(sql1); PreparedStatement statement2 = connection.prepareStatement(sql2); PreparedStatement statement3 = connection.prepareStatement(sql3);) { connection.setAutoCommit(false); final int batchSize = 20; int count = 0; for (int i=1; i<= total; i++) { // Define sql parameters statement.setString(1, p1); statement2.setString(1, p2); statement2.setString(2, p3); statement3.setInt(1, p4); statement3.setString(2, p5); statement.addBatch(); statement2.addBatch(); statement3.addBatch(); if (++count % batchSize == 0) { statement.executeBatch(); statement.clearBatch(); statement2.executeBatch(); statement2.clearBatch(); statement3.executeBatch(); statement3.clearBatch(); connection.commit(); System.out.println(i); } } statement.executeBatch(); statement.clearBatch(); statement2.executeBatch(); statement2.clearBatch(); statement3.executeBatch(); statement3.clearBatch(); connection.commit(); } catch (SQLException e) { e.printStackTrace(); } }
春jdbcTemplateをと結果は私にとって非常に混乱しています。 スプリング
jdbcTemplate
が200秒で1480秒、 JDBC
PreparedStatement
で実行される私はそれがPreparedStatement
未満で効率的であるべきである、下にStatement
を使用すること、jdbcTemplate
源に見て、発見しました。しかし、結果の差は大きすぎるので、Statement
とPreparedStatement
の違いのためにこれが起こるかどうかはわかりません。それについてのあなたのアイデアは何ですか?jdbcTemplate
がnamedParameterJdbcTemplate
に置き換えられた場合、結果は理論的に等しくなるべきですか?