[英]Spring JpaRepostory delete vs deleteInBatch
Spring 中 JpaRepostory 中的delete(...)
和deleteInBatch(...)
方法有什么区别? 第二个“删除一个 SQL 语句中的项目”,但从应用程序/数据库的角度来看,这意味着什么? 为什么存在两种具有相似结果的不同方法,何时使用一种或另一种更好?
编辑:这同样适用于deleteAll()
和deleteAllInBatch()
...
delete
方法将在一次操作中删除您的实体。 deleteInBatch
将批处理多个删除语句并将它们作为 1 个操作删除。
如果您需要大量删除操作,批量删除可能会更快。
这里的答案并不完整!
首先,让我们检查文档!
void deleteInBatch(Iterable<T> entities)
Deletes the given entities in a batch which means it will create a single Query.
因此,“delete[All]InBatch”方法将使用 JPA 批量删除,例如“DELETE FROM table [WHERE ...]”。 这可能更有效,但它有一些警告:
这是因为 JPA 会向数据库发出批量 DELETE 语句,绕过缓存等,因此无法知道哪些实体受到影响。
虽然我在这里找不到具体的文章,但我会推荐Vlad Mihalcea写的所有内容,以便更深入地了解 JPA。
TLDR:“inBatch”方法使用批量 DELETE 语句,它可以快得多,但有一些警告 bc。 它们绕过 JPA 缓存。 您应该真正了解它们的工作原理以及何时使用它们来受益。
日志中的deleteInBatch(...)
看起来像这样: DELETE FROM table_name WHERE (((((((? = id) OR (? = id)) OR (? = id)) OR (? = id)) OR (? = id)) OR (? = id)) OR (? = id))
如果要删除的数据量很大,达到 SQL Server 查询的最大大小,这可能会导致问题: SQL Server 查询的最大大小? IN条款? 有没有更好的方法
只需添加好奇的信息。
您不能在方法名称上使用“batch”创建自定义删除并等待 spring 数据解析它,例如,您不能这样做:
void deleteByYourAttributeInBatch(Iterable<YourObject> object);
你是否需要做这样的事情:
@Modifying
@Transactional
@Query("DELETE FROM YourObject qr WHERE o.yourAtribute IN (:object)")
void deleteByYourAttributeInBatch(Iterable<YourObject> o);
也许这是 spring-data 的一个问题;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.