2016-08-11 64 views
-1

我必须编写一个批处理作业,它将使用作为目标的Teradata DB &,使用Spring批处理框架的Postgres DB。任何人都可以让我知道或者向我推荐一个关于如何尽可能实现这个目标的教程?做spring批处理框架支持teradata?

如果不是,我可以探索的其他选择是什么?

UPDATE

我有一个春天批处理作业,试图使其与甲骨文(来源)& Postgres的(目标)的工作,以后我会改变源Teradata的。但是,我得到的错误,我认为是由于,在Oracle DB中查找作业序列(序列无法创建,因为数据库用户具有只读访问权限)的事实。如何制作作业,在目标数据库(Postgres)中创建序列?

错误:

at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.executeLocalJobs(JobLauncherCommandLineRunner.java:227) 
at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.launchJobFromProperties(JobLauncherCommandLineRunner.java:121) 
at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.run(JobLauncherCommandLineRunner.java:115) 
at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:672) 
... 5 common frames omitted 
Caused by: java.sql.SQLException: ORA-02289: sequence does not exist 

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) 
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) 
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745) 
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210) 
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:804) 
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1049) 
at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:845) 
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1154) 
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1313) 
at org.springframework.jdbc.support.incrementer.AbstractSequenceMaxValueIncrementer.getNextKey(AbstractSequenceMaxValueIncrementer.java:69) 
... 40 common frames omitted 

2016-08-12 12:34:57.467 INFO 11660 --- [main] s.c.a.AnnotationConfigApplicationContext : Closing org.spring[email protected]1cea91 b: startup date [Fri Aug 12 12:34:22 IST 2016]; root of context hierarchy 
2016-08-12 12:34:57.469 INFO 11660 --- [main] o.s.j.e.a.AnnotationMBeanExporter   : Unregistering JMX-exposed beans on shutdown 

** ** BatchConfiguration.java

@Configuration 
@EnableBatchProcessing 
@ComponentScan(basePackageClasses = MyBatchConfigurer.class) 
public class BatchConfiguration { 

@Autowired 
public JobBuilderFactory jobBuilderFactory; 

@Autowired 
public StepBuilderFactory stepBuilderFactory; 

@Autowired 
@Qualifier("oracleDBDataSource") 
public DataSource dataSource1; 

@Autowired 
@Qualifier("postgresDataSource") 
public DataSource dataSource2; 



//Read an Event from oracle DB 
@Bean 
public ItemReader<Event> reader(){ 

    JdbcCursorItemReader<Event> databaseReader = new JdbcCursorItemReader<>(); 
    String sqlQ = "select * from test_event"; 
    databaseReader.setDataSource(dataSource1); 
    databaseReader.setSql(sqlQ); 
    databaseReader.setRowMapper(new BeanPropertyRowMapper<>(Event.class));  
    return databaseReader; 
} 
//EventItemProcessor 
@Bean 
public EventItemProcessor processor() { 

    return new EventItemProcessor(); 
} 

@Bean 
public JdbcBatchItemWriter<Event> writer() { 

    JdbcBatchItemWriter<Event> writer = new JdbcBatchItemWriter<Event>(); 
    writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Event>()); 
    writer.setSql("insert into EVENTS (event_id, event_title, event_start_date, event_end_date, event_type,need_offline_sync, event_status, created_by, created_date, last_updated_by,last_updated_date) VALUES (:event_id, :event_title, :event_start_date, :event_end_date, :event_type,:need_offline_sync, :event_status, :created_by, :created_date, :last_updated_by, :last_updated_date)"); 
    writer.setDataSource(dataSource2); 
    return writer; 
} 
//Postgres Data source for Target 
@Bean(name="postgresDataSource")  
public DataSource postgresDataSource() throws SQLException { 

    final SimpleDriverDataSource dataSource = new SimpleDriverDataSource();    
    dataSource.setDriver(new org.postgresql.Driver()); 
    dataSource.setUrl("jdbc:postgresql://localhost:5432/batch"); 
    dataSource.setUsername("batch"); 
    dataSource.setPassword("batch");     
    return dataSource; 
} 

//Oracle Data source for source 

@Primary 
@Bean(name="oracleDBDataSource")  
public DataSource oracleDBDataSource() throws SQLException { 

    final SimpleDriverDataSource dataSource = new SimpleDriverDataSource();   
    dataSource.setDriver(new oracle.jdbc.driver.OracleDriver()); //(new oracle.jdbc.pool.OracleDataSource()); 
    dataSource.setUrl("jdbc:oracle:thin:@xxxxxxx.com:1521/xxxxx"); 
    dataSource.setUsername("xxxx"); 
    dataSource.setPassword("xxxxx"); 
    return dataSource; 
} 

@Bean 
public JdbcTemplate jdbcTemplate(final DataSource dataSource) { 

    return new JdbcTemplate(dataSource); 
} 


@Bean 
public JobExecutionListener listener() { 

    return new JobCompletionNotificationListener(new JdbcTemplate(dataSource2)); 
} 

// end::listener[] 

// tag::jobstep[] 
@Bean 
public Job importUserJob() { 

    return jobBuilderFactory.get("importUserJob") 
      .incrementer(new RunIdIncrementer()) 
      .listener(listener()) 
      .flow(step1()) 
      .end() 
      .build(); 
} 



@Bean 
public Step step1() { 

    return stepBuilderFactory.get("step1") 
      .<Event, Event> chunk(10) 
      .reader(reader()) 
      .processor(processor()) 
      .writer(writer()) 
      .build(); 
} 
// end::jobstep[] 

}

+0

在应用标签之前,请阅读标签信息! * spring *不是*批处理文件*! – aschipfl

+0

谢谢,编辑标签到spring-batch – pstimeforj

回答

0

你提的问题非常广泛,几乎未见研究工作。不过,可以在弹簧批处理作业中配置数据库读取器和数据库书写器。

您必须配置两个数据源(源数据源是您的Teradata DB,目标数据源是您的Postgres数据库)。看到这个问题和答案信息如何使用弹簧批量来做到这一点:Use of multiple DataSources in Spring Batch

然后,你必须创建一个阅读器与源数据源和一个作家与目标数据源。

略调整标准Spring Batch的引导教程,您的情况:

@Configuration 
@EnableBatchProcessing 
public class BatchConfiguration { 

    @Autowired 
    public JobBuilderFactory jobBuilderFactory; 

    @Autowired 
    public StepBuilderFactory stepBuilderFactory; 

    @Autowired 
    @Qualifier("source") 
    public DataSource source; 

    @Autowired 
    @Qualifier("target") 
    public DataSource target; 

    @Bean 
    public ItemReader<Person> reader() { 
     JdbcCursorItemReader<Person> reader = new JdbcCursorItemReader<Person>(); 
     String sql = "select * from Person"; 
     reader.setSql(sql); 
     reader.setDataSource(source); 
     reader.setRowMapper(rowMapper()); 
     return reader; 
    }  

    @Bean 
    public JdbcBatchItemWriter<Person> writer() { 
     JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>(); 
     writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>()); 
     writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); 
     writer.setDataSource(target); 
     return writer; 
    }   

    @Bean 
    public Job yourJob() { 
     return jobBuilderFactory.get("yourJob") 
       .incrementer(new RunIdIncrementer())      
       .flow(step1()) 
       .end() 
       .build(); 
    } 

    @Bean 
    public Step step1() { 
     return stepBuilderFactory.get("step1") 
       .<Person, Person> chunk(10) 
       .reader(reader())      
       .writer(writer()) 
       .build(); 
    }  
} 

在这个例子中的其余配置请结帐https://spring.io/guides/gs/batch-processing/和更详细的解释结帐本教程http://www.codingpedia.org/ama/spring-batch-tutorial-with-spring-boot-and-java-configuration/(你可以找到一个例子RowMapper也在那里)

+0

感谢您的回应。我更担心从Spring批次(依赖关系等)连接到Teradata DB服务器并拥有多个数据源。在开始使用Teradata DB之前,我试图让多数据源作业与Oracle数据库一起作为源和Postgres数据库作为目标。我遵循了多源Spring批处理场景中提到的不同建议。我仍然有错误。将更新代码和错误。如果您发现任何问题,请告诉我。 – pstimeforj