使用spring数据和JDBC模板进行事务处理



我想在不首先为每个对象进行Select的情况下进行批量删除。我没有用springdatajpa和实体管理器找到实现这一点的方法。出于这个原因,我尝试JDBC模板。然而,我在页面上遇到了问题。这段代码运行良好,所有删除都是通过批处理执行的。不幸的是,每个实体都有一个不必要的选择。

@Transactional
public void deleteFoos() {
Page<Foo> page = repository.findAll(PageRequest.of(0,50);
Pageable pageable = null;
do {
if ( pageable != null ) {
page = repository.findAll( pageable );
}
repository.deleteAll( page.getContent() );
} while ( (pageable = page.nextPageable()) != Pageable.unpaged() );
}

我现在尝试的是使用JDBC模板直接实现整个过程。

@Transactional
public void deleteFoos() {

Page<Foo> page = repository.findAll(PageRequest.of(0,50);
Pageable pageable = null;
do {
if ( pageable != null ) {
page = repository.findAll( pageable );
}
//repository.deleteAll( page.getContent() );
jdbcTemplate.batchUpdate(
"DELETE FROM foo WHERE (id = ?)",
page.getContent(),
page.getTotalItems(),
( preparedStatement, argument ) -> {
preparedStatement.setObject( 1, argument.getId() );
} );
} while ( (pageable = page.nextPageable()) != Pageable.unpaged() );
}

但是,第三页和第四页总是空的。删除操作似乎是直接执行的。自动提交已关闭,还有什么问题?

编辑:Jens的解决方案运行良好:;您可以简单地重复请求第一页并将其删除;

JdbcTemplate只执行SQL语句,所以是的,它们会立即执行。与JPA操作一样,不涉及缓存。但是,即使是JPA操作也会在执行查询之前被刷新到数据库中,所以差别并不大。

你可以简单地重复请求第一个页面并删除它

但是使用带删除的分页并没有多大意义,您可以从表中删除所有行,并在到数据库的一次往返中完成:

DELETE FROM foo

如果您想批量删除,您仍然可以在不加载任何应用程序的情况下执行此操作。细节可能依赖于数据库,但类似的东西应该可以很好地工作:

DELETE FROM foo
LIMIT 100;

最新更新