我有一个父实体,它在 Web 应用程序中拥有许多子级集合。删除该实体的最佳策略是什么?我可以只删除父集合,并且由于级联,所有子集合都将被删除。但我担心这会花费很长时间,并且可能会导致表锁定,从而影响其他用户。或者我可以删除每个子实体并最后删除父实体。什么是最好的方法? 立即删除父级和子级。我用的是这个。
entityManger.remove(parent); -> one transaction
或者我可以循环遍历每个子集合并首先删除所有子集合,最后删除父集合。这会将一笔大交易分成许多较小的交易。
最佳答案
所有其他答案似乎都无法解决您的问题。
首先,除非您正在处理大量使用的表或按顺序或数百万次删除,否则您不会遇到任何重大的性能问题。
但是,如果您确实遇到上述情况,您可以执行以下操作(并且必须在性能或 ROW 锁定预防之间进行选择)
1)确保您的外键中有索引
2)像你说的那样进行批量删除。这将防止锁定,但会降低性能,因为应用程序需要向数据库调用多个语句。更多信息请点击 https://vladmihalcea.com/how-to-batch-delete-statements-with-hibernate/
3) 使用原生 SQL 查询并进行批量删除
DECLARE @RowCount int
WHILE 1=1
BEGIN
DELETE TOP (10000) t1
FROM table t1
WHERE t1.FK_ID = yourFkId
SET @RowCount = @@ROWCOUNT
IF (@RowCount < 10000) BREAK
END
最重要的是测试是否是你的瓶颈问题,避免过早优化。
希望对你有帮助
关于hibernate - 在 Hibernate 中删除大型实体的最佳策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38908328/