hibernate - 在 Hibernate 中删除大型实体的最佳策略

标签 hibernate jpa entity one-to-many

我有一个父实体,它在 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/

相关文章:

hibernate - 如何避免使用 hibernate 模式更新

java - 何时使用 Hibernate 缓存(二级)?

java - 如何迭代包含多个字段的对象数组?

java - 如何在类中引用 EntityPlayer 方法

c# - Entity Framework - 一般持久化枚举?

entity - 在有或没有增值税的情况下节省价格?

java - Hibernate hql 内连接

java - 初始化 C3P0 连接池需要 2 分钟

java - JPA存储库org.hibernate.LazyInitializationException : could not initialize proxy - no Session

java - Spring Data JPA 查询、过滤?搜索引擎 ? JPQL?