正常邏輯是這樣:jpa直接執行sql刪除,把同步過來的資料取出id存在list裡面,用list避免同步過來有重複資料,
在dao層使用jpa拼接sql寫法,下面這個方法會變為sql:
delete from user where id in();
@transactional
void deleteuserbyidin(list ids)
;
這是常用的批量刪除寫法,把需要刪除的id塞到list集合裡面,然後把集合塞給刪除方法,但是呼叫這個寫法去刪除上萬條資料的話就會報記憶體溢位這個錯誤。
或者是使用這種方法,把裝有id的list集合通過id查詢出實體轉在另乙個list實體集合裡面,在dao層繼承了extends jparepository之後,呼叫deleteallinbatch刪除方法,刪除實體是要比通過id刪除要快得多。但是資料量太太還是會記憶體溢位
dao.deleteallinbatch(
);
寫sql,拼接之後然後通過jpa執行sql,這樣壓力就放到資料庫層面了,伺服器就不會卡死,這也是錯誤的。資料庫預設sql最大的大小是1m,如果刪除資料量大,超過了1m還是會記憶體溢位,雖然可以更改這個最大值,但是比較麻煩。
sql
="delete from t_user where id in(?)"
;string param = stringutils.
join
(list,
",")
;--list是裝有id的集合
會出現上面這些報錯情況是因為資料量太多了不能同時刪除,那我們可以採取分頁形式,不用全部展示出來,一點點的刪除。
只要是通過分頁刪除,不管你是寫sql還是其他的基本刪除方法,都可以使用。
list
> partition = lists.
partition
(list,
500)
;//刪除
for(list
resultlist : partition)
以上就是mysql批量刪除資料-避免記憶體溢位的方法,如果你還有更好的,也希望你可以提出來,大家努力做乙個高效的程式猿。對你有幫助的話可以多多關注一下。 MySQL批量刪除資料指令碼
usr bin python coding utf 8 import os import mysqldb import time db mysqldb.connect host 172.16.32.11 user a passwd root1123 port 3307,charset utf8 cu...
Mysql 批量刪除資料表資料
drop 不再需要該錶 truncate 保留該錶,但要刪除所有記錄 delete 要刪除部分記錄或者有可能會後悔的話,用 delete 1.drop table tb drop 是直接將 刪除,無法找回。例如刪除 user 表 drop table user 2.truncate table tb...
redis批量刪除資料
redis本身未提供批量刪除的功能,但我們可以使用下面的技巧批量刪除全部或指定格式的資料。刪除以test開頭的所有key值 redis cli h p 埠 a 密碼 keys test xargs redis cli h p 埠 a 密碼 del 如果是刪除localhost的redis資料,且未設...