我有一個控制器,它首先在 x 和 y 之間選擇 status = 'CREATED' transferType = 'SOME_TYPE' 和 DATE_TIME 的所有資料,然后將所有資料放入 List<TransferEntity>
然后我將瀏覽串列中的每個元素并將狀態更新為“已檢查”
if (listOfTransfers.isNotEmpty()){
for(element in listOfTransfers){
element.status = "CHECKED"
repos.transfers.save(element)
}
}
物體本身非常簡單,與其他表沒有關系
@Entity
@Table( name = "TRANSFERS")
class TransferEntity(
@Id
@Column(name = "Identifier", nullable = false)
var Identifier: String? = null,
@Column(name = "TRANS_DATE_TIME")
var transDateTime: LocalDateTime? = null,
@Column(name = "TRANS_TYPE", nullable = true, length = 255)
var transType: String? = null,
@Column(name = "STATUS")
var status: String = ""
)
我嘗試使用索引(oracle)
`CREATE INDEX TRANS_INDEX_1 ON TRANSFERS(STATUS)`
`CREATE INDEX TRANS_INDEX_2 ON TRANSFERS(TRANS_DATE_TIME)`
`CREATE INDEX TRANS_INDEX_3 ON TRANSFERS(TRANS_TYPE)`
或將它們創建為一個索引
CREATE INDEX TRANS_INDEX_4 ON TRANSFERS(STATUS,TRANS_DATE_TIME,TRANS_TYPE)
但這并沒有太大的不同 更新
- witn TRANS_INDEX_1 2 和 3 - 3192 個元素在 5 分 30 秒內更新
- 使用 TRANS_INDEX_4 - 3192 個元素在 5 分 30 秒內更新
也許有不同的方法來批量更新串列中的元素,或者索引完全錯誤,我沒有像我想要的那樣理解它們。
UPDATE 2 在技術上 saveAll() 方法作業得更快,但我仍然認為應該有改進的余地
- saveAll() - 在 3 分 21 秒內保存了 3192 個元素
- save() 3192 個元素在 5 分 30 秒內保存
uj5u.com熱心網友回復:
save()每次更新元素時??都會呼叫。1000 個元素將創建對資料庫的 1000 次查詢呼叫,您重復對資料庫的太多呼叫,這就是您的函式運行緩慢的原因。
相反,您可以在更新所有元素后使用saveAll ()
如下所示,我們還必須正確配置batch_size才能真正做到這一點
索引在這種情況下無濟于事,因為它們比更新或插入更有利于選擇操作
uj5u.com熱心網友回復:
由于您為串列的所有元素設定了相同的值,因此您可以進行批量更新查詢:
Query q = entityManager.createQuery("update TransferEntity t set t.status = :value where t in (:list)");
q.setParameter("value", "CHECKED");
q.setParamter("list", listOfTransfers);
q.execute();
如果您使用 ORACLE 作為后端,請注意該in子句限制為 1000 個元素。因此,您可能必須將串列拆分為 1000 個元素的存盤桶,并針對每個存盤桶回圈此查詢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/530330.html
標籤:春天休眠科特林jpa
上一篇:MVC表單資料無法系結到模型
