Spring 批处理 JpaPagingItemReader(可能)在使用 SELECT 本机查询时从数据库中删除行
Spring batch JpaPagingItemReader (possibly) removes rows from the database while using SELECT native query
我正在尝试使用 JpaPagingItemReader 执行本机 SELECT 查询。但是,当我 运行 它时,一些记录会从我的数据库中删除(我在批处理作业执行之前和之后使用 mysql 控制台检查了它)。我与 MySQL 数据库通信的唯一地方是读取数据时 - 如下所示:
@Autowired
EntityManagerFactory entityManagerFactory
@Value('${integration.date.value}')
String date
@Bean
JpaPagingItemReader<Entry> entryJpaPagingItemReader() {
JpaPagingItemReader jpaPagingItemReader = new JpaPagingItemReader<Entry>()
jpaPagingItemReader.setEntityManagerFactory(entityManagerFactory)
jpaPagingItemReader.setQueryProvider(createQueryProvider())
jpaPagingItemReader.setPageSize(500)
jpaPagingItemReader.afterPropertiesSet()
jpaPagingItemReader
}
private JpaNativeQueryProvider<Entry> createQueryProvider() {
String query = "SELECT distinct * FROM entry e WHERE e.entry_formal_category in ('FIL','SER') " +
"and e.entry_categories not regexp 'DZI|INN|DOK' and e.entry_date = \'" + date + "\'" +
" GROUP BY e.entry_title ORDER BY e.entry_id"
JpaNativeQueryProvider<Entry> queryProvider = new JpaNativeQueryProvider<Entry>()
queryProvider.setSqlQuery(query)
queryProvider.setEntityClass(Entry)
queryProvider.afterPropertiesSet()
queryProvider
}
我对这种行为感到非常震惊 - 每次执行作业时,我都会从数据库中丢失大约 10 到 50 条记录。有没有可能是原生查询结果分页导致的问题?
编辑:一点更新。当我将 pageSize 设置为 1500(这是一个大小,将在一页上保存所有行)时,问题不会发生。看起来它可能是一个 spring-batch 错误。
好的 - 我错过了一个地方,在那里我修改了一个 Entry 对象,并且在获取另一页之前将更改传播到数据库。 Spring 批处理工作得很好 - 这是我的错。问题已解决 - 谢谢! :)
我正在尝试使用 JpaPagingItemReader 执行本机 SELECT 查询。但是,当我 运行 它时,一些记录会从我的数据库中删除(我在批处理作业执行之前和之后使用 mysql 控制台检查了它)。我与 MySQL 数据库通信的唯一地方是读取数据时 - 如下所示:
@Autowired
EntityManagerFactory entityManagerFactory
@Value('${integration.date.value}')
String date
@Bean
JpaPagingItemReader<Entry> entryJpaPagingItemReader() {
JpaPagingItemReader jpaPagingItemReader = new JpaPagingItemReader<Entry>()
jpaPagingItemReader.setEntityManagerFactory(entityManagerFactory)
jpaPagingItemReader.setQueryProvider(createQueryProvider())
jpaPagingItemReader.setPageSize(500)
jpaPagingItemReader.afterPropertiesSet()
jpaPagingItemReader
}
private JpaNativeQueryProvider<Entry> createQueryProvider() {
String query = "SELECT distinct * FROM entry e WHERE e.entry_formal_category in ('FIL','SER') " +
"and e.entry_categories not regexp 'DZI|INN|DOK' and e.entry_date = \'" + date + "\'" +
" GROUP BY e.entry_title ORDER BY e.entry_id"
JpaNativeQueryProvider<Entry> queryProvider = new JpaNativeQueryProvider<Entry>()
queryProvider.setSqlQuery(query)
queryProvider.setEntityClass(Entry)
queryProvider.afterPropertiesSet()
queryProvider
}
我对这种行为感到非常震惊 - 每次执行作业时,我都会从数据库中丢失大约 10 到 50 条记录。有没有可能是原生查询结果分页导致的问题?
编辑:一点更新。当我将 pageSize 设置为 1500(这是一个大小,将在一页上保存所有行)时,问题不会发生。看起来它可能是一个 spring-batch 错误。
好的 - 我错过了一个地方,在那里我修改了一个 Entry 对象,并且在获取另一页之前将更改传播到数据库。 Spring 批处理工作得很好 - 这是我的错。问题已解决 - 谢谢! :)