插入的最快方法是使用准备好的语句。
注入 jdbcTemplate 并使用它的 batchUpdate 方法并设置批处理大小。速度快如闪电。
如果你认为你不能使用批量插入,这对我来说很难理解,那么将批量大小设置为 1。
然而,最优化的批量大小肯定比这要大,并且取决于插入语句。你必须尝试一下。
这里有一个名为 LogEntry 的类的示例。用您的类、表、列和属性替换类、表、列和属性,并将其放入您的存储库实现中。
还请确保您设置了此处提到的应用程序属性https://stackoverflow.com/a/62414315/12918872
关于 id 生成器,可以设置一个序列 id 生成器(也显示在该链接中),或者在我的情况下,只需通过在开始时询问表的 maxId 然后向上计数来自行生成它。
@Autowired
private JdbcTemplate jdbcTemplate;
public void saveAllPreparedStatement2(List<LogEntry> logEntries) {
int batchSize = 2000;
int loops = logEntries.size() / batchSize;
for (int j = 0; j <= loops; j++) {
final int x = j;
jdbcTemplate.batchUpdate("INSERT INTO public.logentries(\r\n"
+ " id, col1, col2, col3, col4, col5, col6)\r\n"
+ " VALUES (?, ?, ?, ?, ?, ?, ?);\r\n", new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i) throws SQLException {
int counter = x * batchSize + i;
if (counter < logEntries.size()) {
LogEntry logEntry = logEntries.get(counter);
ps.setLong(1, (long) logEntry.getId());
ps.setString(2, (String) logEntry.getAttr1());
ps.setInt(3, (int) logEntry.getAttr2());
ps.setObject(4, logEntry.getAttr3(), Types.INTEGER);
ps.setLong(5, (long) logEntry.getAttr4());
ps.setString(6, (String) logEntry.getAttr5());
ps.setObject(7, logEntry.getAttr6(), Types.VARCHAR);
}
}
public int getBatchSize() {
if (x * batchSize == (logEntries.size() / batchSize) * batchSize) {
return logEntries.size() - (x * batchSize);
}
return batchSize;
}
});
}
}