Spring Batch "Geçersiz nesne adı BATCH_JOB_INSTANCE"
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:
- Meta veri tablolarının yerel bir veritabanında veya h2db gibi bellek içi veritabanında nasıl oluşturulacağı.
- 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
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.
İ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ı:
- 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();
}
}
- 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;
}
}
- İş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
- 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: