带有单个数据源的 SpringBoot + Batch + Cloud Task @EnableTask 注释导致“序列不存在”问题

Posted

技术标签:

【中文标题】带有单个数据源的 SpringBoot + Batch + Cloud Task @EnableTask 注释导致“序列不存在”问题【英文标题】:SpringBoot + Batch + Cloud Task @EnableTask annotation with single datasource causes "Sequence does not exist" Issue 【发布时间】:2021-01-12 16:39:27 【问题描述】:

目前我正在使用 SpringBoot(2.3.3 版本)和批处理(4.2.4 版本)和 spring-cloud-starter-tsk(2.2.3 版本)和单个数据源(oracle)。我的 BatchConfiguration 扩展了 DefaultBatchConfigurer 并制作了 setDataSource。现在我正在尝试连接 Oracle 数据库并读取记录并生成平面文件。

我遇到了错误,奇怪的是我能够获取数据源并且 SEQUENCE (TASK_SEQ) 在 DB 中可用。

请在下面找到我的其他文件

BatchConfiguraton.java 是

Application.java 是

-application.yml 是

【问题讨论】:

"SEQUENCE (TASK_SEQ) 在 DB 中可用。" - 甲骨文不同意,我(有点)倾向于相信它。您能证明它确实存在于您要连接的架构中吗? select * from user_sequences where upper(sequence_name) = 'TASK_SEQ'; 返回什么? @Littlefoot :当我提到“SEQUENCE (TASK_SEQ) 在 DB 中可用”时,我手动执行了此操作。这并不意味着甲骨文提供了这个。我关注docs.spring.io/spring-batch/docs/4.2.4.RELEASE/reference/html/… 恐怕我不明白“我手动执行”是什么意思。 “这”是什么? @Littlefoot:Spring Batch Tables 和序列可以手动/初始化过程执行。但是,这个详细讨论与原始帖子无关。 您的应用程序连接到数据库。为了成功地做到这一点,您必须提供有效的凭据 - 用户名和密码。用户(由这些凭据标识)应包含名称为 TASK_SEQ 的序列。如果没有,您将无法使用它。因此:该用户是否拥有名为 TASK_SEQ 的序列? 【参考方案1】:

在您的批处理配置中,您使用的是MapJobRepositoryFactoryBean,它会在内存中创建一个基于 Map 的 JobRepository。您需要删除它并使用指向您的 Oracle 数据源的基于 JDBC 的作业存储库,如参考文档中所述:Configuring a JobRepository。

在运行作业之前,您需要确保在 Oracle 数据库中创建了 Spring Batch 元数据表。

Spring Cloud Task 也应该进行同样的配置。

【讨论】:

以上是关于带有单个数据源的 SpringBoot + Batch + Cloud Task @EnableTask 注释导致“序列不存在”问题的主要内容,如果未能解决你的问题,请参考以下文章

window中使用bat启动springboot项目,并解决乱码问题

window中使用bat启动springboot项目,并解决乱码问题

windows设置SpringBoot程序(bat脚本)开机自启

带有 ArrayList<String> 的 Java 对象被序列化为单个字符串,而不是包含一个字符串的数组

如何在单个Boot应用中配置多数据库

Angular 服务器端渲染 vs maven 包作为单个 jar