Ich benutze Oracle 11g. Ich habe 3 Tabellen (A,B,C
) in meiner Datenbank Ich habe ein Stück Code, der drei Einsätze führt: zuerst in A
und C
, danach in B
. Dieses Stück Code wird oft ausgeführt (200000
) und macht 200000
Operationen in jede Tabelle einfügen.Spring jdbcTemplate vs PreparedStatement. Leistungsunterschied
Ich habe zwei Möglichkeiten, um eine Einführung zu machen:
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(); } }
Frühling jdbcTemplate:
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); } }
I Ausführungszeit gemessen für total = 200000
und die Ergebnisse sind sehr verwirrend für mich. Frühling jdbcTemplate
wird in 1480 Sekunden ausgeführt, jdbc PreparedStatement
in 200 Sekunden
ich in jdbcTemplate
Quelle gesucht und gefunden, dass es Statement
unter verwendet, die weniger effizient sein sollte als PreparedStatement
. Allerdings ist der Unterschied in den Ergebnissen zu groß und ich bin mir nicht sicher, ob dies nur wegen des Unterschieds zwischen Statement
und PreparedStatement
geschieht. Was sind deine Ideen dazu? Sollten die Ergebnisse theoretisch gleich sein, wenn jdbcTemplate
auf namedParameterJdbcTemplate
ersetzt wird?