记录使用jpa 删除 数据过多所遇到的坑
前提:有个业务需求要处理 100 万条数据左右,其中就有删除操作,然后就在这个删除操作不断踩坑,记录一下
-
刚开始使用 jpa 自带的deleteAll 方法的时候直接删除这100万条数据,系统直接提示OOM,堆栈溢出
然后就把这100 万条数据 分批次处理,一次删除 10 万条数据,但是在删除的过程中,日志在不断的打印查询的接口,仔细一看deleteAll 的时候 它会调用先调用查询接口,然后再删除,
100 万条数据 先查询 再删除会耗费较大的资源,这种方法也不可取 -
后面查询资料 有个 jpa 有个 deleteInBatch 方法 不会查询数据,会直接做删除操作,但是在删除的过程中出现了
后面发现打印的sql 语句 是 delete from xx where id = ? or id= ? or id=?.. 这种方式也不可取 -
后续自己写了原生的 删除sql 语句, delete from xx where id in () 但是后续报了一个长度限制的错误,只能将批次处理 删除3万 左右的数据量,记得删除完数据之后 list.clear() 把list 情况,让内存及时释放出来