Вы создаете String
с 50 тыс. Строк, это означает, что вы создаете 50 тыс. * 5 String
(каждая конкатенация создает новый String
экземпляр. Это то, что убивает вашу производительность.
while (rs.next()) {
script += "(";
script += rs.getInt(1) + ", '" + rs.getString(2) + "', '" + rs.getString(3) + "'";
script += "),";
}
Я заметил, что вы не оправдываете String script
, поэтому, если вы просто хотите создать String
, используйте StringBuilder
StringBuilder script = new StringBuilder("insert into table1 values ");
while (rs.next()) {
script.append("(")
.append(rs.getInt(1)).append(", '")
.append(rs.getString(2)).append("', '")
.append(rs.getString(3)).append("'")
.append("),");
}
script.setLength(script.length() - 1); //to remove the last comma.
String query = script.toString();
StringBuilder
предотвращает огромное количество экземпляров String
, созданных даром.
Если вы хотите вставить эти значения после этого, используйте PreparedStatement
напрямую вместо построения запроса:
PreparedStatement psInsert = c1.prepareStatement("insert into table1 values (?,?,?)");
while (rs.next()) {
psInsert.setInt(1, rs.getInt(1));
psInsert.setString(2, rs.getString(2));
psInsert.setString(2,rs.getString(3));
psInsert.execute();
}
Тогда, если вы хотите улучшить это, используйте пакетную систему для отправки небольшого блока вставки. Использование Statement.addBatch()
и Statement.executeBatch()
while (rs.next()) {
psInsert.setInt(1, rs.getInt(1));
psInsert.setString(2, rs.getString(2));
psInsert.setString(2,rs.getString(3));
psInsert.addBatch();
if(batchSize++ > 100){ //Execute every 100 rows
psInsert.executeBatch();
batchSize = 0;
}
}
if(batchSize > 0){ //execute the remainings data
psInsert.executeBatch();
}
StringBuilder Benchmark
Не официальный, просто продолжительность простого исполнения
LocalTime start = LocalTime.now();
StringBuilder sb = new StringBuilder("Foo;");
for(int i = 0; i < 50_000; i++){
sb.append("Row").append(i).append(";\n");
}
System.out.println(Duration.between(start, LocalTime.now()).toNanos());
String s = sb.toString();
System.out.println(s.substring(0, 50));
Это занимает 15 наносекунд
LocalTime start = LocalTime.now();
String s = "Foo;";
for(int i = 0; i < 50_000; i++){
s += "Row" + i + ";\n";
}
System.out.println(Duration.between(start, LocalTime.now()).toMillis());
System.out.println(s.substring(0, 50));
Это занимает> 6 секунд