用于临时表(创建并插入)和存储过程执行组合的弹簧批处理读取器
问题描述:
我正在创建一个Spring批处理应用程序,以便将数据从旧Sybase数据库迁移到可加载到目标系统的csv文件。用于临时表(创建并插入)和存储过程执行组合的弹簧批处理读取器
我在设计阅读器配置时遇到问题。
可能对读者输入的组合:
- 直接SQL查询(JdbcCursorReader适用) - 没有问题
- 存储过程(存储过程的读者是合适的) - 没有问题
- 下面的步骤执行得到输入的序列 - 我的问题
- 创建临时表
- 插入值到临时表
- 执行存储过程(从临时表,过程他们读取输入和输出写入到相同的临时表)从插入的临时表
- 读数据
我被这个需求#3封锁,请帮我解决问题。
注意:我正在使用Spring Batch的动态配置进行Spring启动应用程序。
ItemReader<TreeMap<Integer, TableColumn>> itemReader = ReaderBuilder.getReader(sybaseDataSource, sybaseJdbcTemplate, workflowBean);
ItemProcessor<TreeMap<Integer, TableColumn>, TreeMap<Integer, TableColumn>> itemProcessor = ProcessorBuilder.getProcessor(workflowBean);
ItemWriter<TreeMap<Integer, TableColumn>> itemWriter = WriterBuilder.getWriter(workflowBean);
JobCompletionNotificationListener listener = new JobCompletionNotificationListener();
SimpleStepBuilder<TreeMap<Integer, TableColumn>, TreeMap<Integer, TableColumn>> stepBuilder = stepBuilderFactory
.get(CommonJobEnum.SBTCH_JOB_STEP_COMMON_NAME.getValue()).allowStartIfComplete(true)
.<TreeMap<Integer, TableColumn>, TreeMap<Integer, TableColumn>>chunk(10000).reader(itemReader);
if (itemProcessor != null) {
stepBuilder.processor(itemProcessor);
}
Step step = stepBuilder.writer(itemWriter).build();
String jobName = workflowBean.getiMTWorkflowTemplate().getNameWflTemplate() + workflowBean.getIdWorkflow();
job = jobBuilderFactory.get(jobName).incrementer(new RunIdIncrementer()).listener(listener).flow(step).end().build();
jobLauncher.run(job, jobParameters);
答
'Sybase'是一家公司的名称(几年前被SAP收购)。在Sybase名称下生成(至少)4种不同的数据库产品... Adaptiver Server Enterprise(ASE),SQL Anywhere,IQ,Advantage DB。
如果您声明您尝试从哪个Sybase数据库产品中提取数据,它将有所帮助。
假设你正在谈论ASE ...
如果你需要做的是拉出来的数据Sybase表的,那么为什么通过编写SQL,特效,春代码的所有跳火圈,等等?或者这是一些家庭作业(但即便如此,为什么要走这条路)?
只需使用bcp(Sybase数据服务器附带的OS级实用程序)从Sybase表中提取数据即可。使用几个命令行标志,您可以告诉bcp将数据写入分隔文件。
嗨马克,感谢您的回复。是的,ASE。我正在开发一个动态ETL工具(需求),它接收输入(从一些设置表)作为sql(带/不带参数),存储过程名称(带/不带参数/标准),多sql +存储过程与多个结果集执行等等所有这些可能的组合。 BCP不适合我们。所以我们关注上述方法。如果你有任何想法,请投射一些灯。 – vijaidhas