【发布时间】:2017-10-23 16:18:36
【问题描述】:
我的要求是从数据库中读取数据并将其聚合并转换为字节,然后将其流式传输到 Blob 列中的另一个数据库(Oracle)。
Oracle 要求禁用 JDBC 自动提交以流式传输到 Blob 列并在完成时调用 Connection#Commit。
我目前有 3 个步骤。
第 1 步(Tasklet):
它有两个 SQL 查询。一个初始化列(UPDATE DATABASEUSER.TABLENAME SET payload = empty_blob() WHERE PrimaryKey= ?)
第二个返回 Blob 定位器 (SELECT payload AS payload FROM DATABASEUSER.TABLENAME WHERE PrimaryKey = ? FOR UPDATE)
我还从数据源获取连接对象以禁用自动提交
第 2 步(查克) 我有一个以通用方式从源数据库读取数据的 IteamReader 和一个将行转换为 CSV 格式但以字节为单位的处理器。然后我有一个自定义 ItemWriter 将数据流式传输到 Blob 列。
第 3 步(Tasklet) 这是我清理并提交连接的时候。
问题 1:这是正确的策略吗?感谢任何方向,因为我有点不确定
【问题讨论】:
-
没有。您不能跨步骤持有事务。每个步骤都必须自己提交。
-
@DeanClark 我解决了,谢谢。
标签: oracle jdbc spring-boot spring-batch spring-transactions