Spring Batch "Geçersiz nesne adı BATCH_JOB_INSTANCE"

Sep 27 2020

Azure SQL sunucu veritabanını sorgulamak ve verileri bir CSV dosyasına yazmak için bir yay grubu oluşturdum. Bende olmayan createveritabanı için izinleri. Invalid Object name BATCH_JOB_INSTANCEToplu işi çalıştırırken bu hatayı alıyorum . İlkbahar toplu meta veri tablolarının ana veri tabanında oluşturulmasını istemiyorum. Ya da h2db gibi başka bir yerel veya bellek içi db'ye sahip olabilirsem faydalı olur. Ben de spring-batch-initialize-schema=neverzaten ekledim , buradaki benzer soruların çoğu yanıtının olduğu durum buydu, ancak bu yardımcı olmadı.

Düzenle:

I çözülmüş Invalid Object nameolarak uzanan ana veritabanına oluşturulan meta veri tabloları önleyerek hata DefaultBatchConfigurersınıf ve geçersiz kılma setDataSourceve böylece bunları bellek haritası-depo oluşturulan olan yöntem. Şimdi iki seçeneği denemek istiyorum:

  1. Meta veri tablolarının yerel bir veritabanında veya h2db gibi bellek içi veritabanında nasıl oluşturulacağı.
  2. Veya zaten ana veritabanında oluşturulmuş meta veri tablolarım varsa, aldığım ana tablomdan farklı bir şemada. İşi ve adım ayrıntı verilerini bunlarda depolamak için işimi başka bir şemadaki bu meta veri tablolarına nasıl yönlendirebilirim?
@Configuration
public class SpringBatchConfig extends DefaultBatchConfigurer{

@Override
    public void setDataSource(DataSource datasource) {

    }
...

Application.properties dosyam şöyle görünüyor:

spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

spring-batch-initialize-schema=never
spring.batch.job.enabled=false

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect

Yanıtlar

MahmoudBenHassine Oct 02 2020 at 07:57

Meta veri tablolarının yerel bir veritabanında veya h2db gibi bellek içi veritabanında nasıl oluşturulacağı.

Bunun için kullanabilirsiniz spring.batch.initialize-schema=embedded.

Veya zaten ana veritabanında oluşturulmuş meta veri tablolarım varsa, aldığım ana tablomdan farklı bir şemada. İşi ve adım ayrıntı verilerini bunlarda depolamak için işimi başka bir şemadaki bu meta veri tablolarına nasıl yönlendirebilirim?

Spring batch, belirli bir şemaya değil, bir veri kaynağına karşı çalışır. Meta veri tabloları farklı bir şemadaysa, o şemaya işaret eden ikinci bir veri kaynağı oluşturmanız ve bunu iş havuzunda ayarlamanız gerekir.

JosephXu Oct 09 2020 at 06:45

İki veri kaynağı içeren bir demo oluşturdum. Toplu meta veriler H2 DB'de saklanır ve İş veri kaynağı Azure SQL'dir.

İşte proje yapısı:

  1. DataSource bean için bir DataSourceConfigsınıf tanımlamalı ve @Primaryaçıklama kullanmalıyız :
@Configuration
public class DataSourceConfig {

    @Bean(name = "mssqlDataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource appDataSource(){
        return DataSourceBuilder.create().build();
    }
    
    @Bean(name = "h2DataSource")
    @Primary
    // @ConfigurationProperties(prefix="spring.datasource.h2")
    public DataSource h2DataSource() {
        return DataSourceBuilder.create()
                .url("jdbc:h2:mem:thing:H2;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE")
                .driverClassName("org.h2.Driver")
                .username("sa")
                .password("")                   
                .build();
    }
    
}
  1. ItemReaderDbDemo sınıfında, @Autowired @Qualifier("mssqlDataSource")Spring Batch görevinde dataSource'u belirtmek için kullanıyoruz :
@Configuration
public class ItemReaderDbDemo {
    
    //generate task Object
    @Autowired
    private JobBuilderFactory jobBuilderFactory;
    
    //Step exec tasks
    //generate step Object
    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    @Qualifier("mssqlDataSource")
    private DataSource dataSource;

    @Autowired
    @Qualifier("dbJdbcWriter")
    private ItemWriter<? super Todo> dbJdbcWriter;
    
    @Bean
    public Job itemReaderDbDemoJob() {
        return jobBuilderFactory.get("itemReaderDbDemoJob").start(itemReaderDbStep()).build();
    }

    @Bean
    public Step itemReaderDbStep() {
        return stepBuilderFactory.get("itemReaderDbStep")
                .<Todo,Todo>chunk(2)
                .reader(dbJdbcReader())
                .writer(dbJdbcWriter)
                .build();
    }

    @Bean
    @StepScope
    public JdbcPagingItemReader<Todo> dbJdbcReader() {
        JdbcPagingItemReader<Todo> reader = new JdbcPagingItemReader<Todo>();
        reader.setDataSource(dataSource);
        reader.setFetchSize(2);
        reader.setRowMapper(new  RowMapper<Todo>() {
            @Override
            public Todo mapRow(ResultSet rs, int rowNum) throws SQLException {
                Todo todo = new Todo();
                todo.setId(rs.getLong(1));
                todo.setDescription(rs.getString(2));
                todo.setDetails(rs.getString(3));
                return todo;
            }   
            
        });
        SqlServerPagingQueryProvider provider = new  SqlServerPagingQueryProvider();
        provider.setSelectClause("id,description,details");
        provider.setFromClause("from dbo.todo");
        
        //sort
        Map<String,Order> sort = new HashMap<>(1);
        sort.put("id", Order.DESCENDING);
        provider.setSortKeys(sort);
        
        reader.setQueryProvider(provider);
        return reader;
    }
}

  1. İşte benim application.properties:
logging.level.org.springframework.jdbc.core=DEBUG

spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.jdbcUrl=jdbc:sqlserver://josephserver2.database.windows.net:1433;database=<Your-Database-Name>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
spring.datasource.username=<Your-UserName>
spring.datasource.password=<Your-Password>
spring.datasource.initialization-mode=always
  1. Azure SQL'imden beklenen sonucu döndürür. Bu arada, Azure sql kullanıcı adımın veritabanı için oluşturma izinleri yok.
    Sonuç şunu gösterir: