我正在開發一個 Spring Boot 應用程式。在這里,我有 100,000 條記錄由不同的行程插入到資料庫中。并一一插入。我不能批量插入。
所以在啟動一些任務時表現良好并沒有花費太多時間,但是應用程式的一些行程和資料庫增長緩慢——2、插入時間在增加。
我怎樣才能加快這個程序或避免讓它變慢?
uj5u.com熱心網友回復:
插入的最快方法是使用準備好的陳述句。
注入 jdbcTemplate 并使用它的 batchUpdate 方法并設定批處理大小。這是閃電般的快。
如果您認為不能使用批量插入,這讓我很難理解,那么將批量大小設定為 1。
但是,最佳批量大小肯定大于此值,并且取決于插入陳述句。你必須嘗試一下。
這里有一個名為 LogEntry 的類的示例。用您的類、表、列和屬性替換類、表、列和屬性,并將其放入您的存盤庫實作中。
@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;
}
});
}
}
uj5u.com熱心網友回復:
給你一些建議:
如果您說插入更多記錄,則插入時間會增加,這是不正常的。根據我的經驗,很可能是由于程式中的一些邏輯錯誤導致在插入更多記錄時處理更多必要資料。所以請先修改你的插入邏輯。
如果物體
IDENTITY用于生成 is ID ,則 Hibernate 無法批量插入物體。您必須將其更改為使用or演算法SEQUENCE生成 ID 。pooledpooled-lo確保在休眠配置中啟用 JDBC 批處理功能
如果您使用的是 PostgreSQL ,您可以添加
reWriteBatchedInserts=trueJDBC 連接字串,這將提供 2-3 倍的性能增益。確保每個事務都會插入一批物體然后提交,但不是每個事務只插入一個物體。
有關第 (2)、(3) 和 (4) 點的更多詳細資訊,您可以在此參考我之前的回答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/336545.html
