是否可以使用JpaRepository在Spring Data JPA中使用“ TRUNCATE”?还是比标准deleteAll()更有效的方法?

imk*_*epo 4 java mysql sql spring spring-data-jpa

我目前使用标准的jparepository方法repository.deleteAll()在添加新信息之前清理表。该表包含8300行,每行5列。目前将它们全部删除大约需要80秒,而使用标准repository.saveAll(list)将它们放入则需要1-3秒。有更有效的方法吗?在SQL中使用DELETE FROM表手动删除数据需要0.1秒。使用MySQL数据库。从删除日志中放入数据 日志。

Sim*_*lli 6

deleteAll获取所有实体,然后一个一个地删除:

// Code from SimpleJpaRepository

@Transactional
public void deleteAll() {

    for (T element : findAll()) {
        delete(element);
    }
}
Run Code Online (Sandbox Code Playgroud)

我建议您在仓库中创建自己的删除方法,例如:

@Modifying
@Transactional
@Query("delete from MyEntity m")
void deleteAllWithQuery();
Run Code Online (Sandbox Code Playgroud)

这将仅创建一个SQL DELETE语句。

  • DELETE是DML命令,TRUNCATE是DDL命令。因此,TRUNCATE TABLE 比 DELETE 更快并且使用更少的系统资源,因为 DELETE 会扫描表以生成受影响的行数,然后逐一删除这些行,并在数据库日志中为每个删除的行记录一个条目,而 TRUNCATE TABLE 只是删除所有行而不提供任何附加信息。 (2认同)

Sad*_*irD 5

例如,在您的服务界面中:

在您的服务界面中:

public interface MyTableInterface {
    //...

    void truncateMyTable();
}
Run Code Online (Sandbox Code Playgroud)

在您的服务实现中(使用@AutowiredmyTableRepository):

public class MyTableImpl implements MyTableService {

    // other methods, @Autowiring, etc

    @Override
    @Transactional
    public void truncateMyTable() {
        myTableRepository.truncateMyTable();
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的存储库中;

public interface MyTableRepository extends JpaRepository<MyTable, Long> {
    //....

    @Modifying
    @Query(
            value = "truncate table myTable",
            nativeQuery = true
    )
    void truncateMyTable();
}
Run Code Online (Sandbox Code Playgroud)

编辑:还请注意@Transactional服务的实现层,而不是将其放置在DAO /存储库层上

  • 请记住,TRUNCATE 是 DDL,而不是 DML。通常,应用程序不应具有发出 DDL 命令的权限。 (2认同)