Spring Batch“ ชื่อวัตถุไม่ถูกต้อง BATCH_JOB_INSTANCE”

Sep 27 2020

ฉันได้สร้างชุดสปริงเพื่อสืบค้นฐานข้อมูลเซิร์ฟเวอร์ Azure SQL และเขียนข้อมูลลงในไฟล์ CSV ฉันไม่มีcreateสิทธิ์สำหรับฐานข้อมูล ฉันได้รับข้อผิดพลาดนี้Invalid Object name BATCH_JOB_INSTANCEในการเรียกใช้ชุดงาน ฉันไม่ต้องการให้สร้างตารางข้อมูลเมตาแบตช์แบบสปริงในฐานข้อมูลหลัก หรือจะเป็นประโยชน์ถ้าฉันสามารถมีได้ในฐานข้อมูลในเครื่องหรือในหน่วยความจำอื่นเช่น h2db ฉันได้เพิ่มspring-batch-initialize-schema=neverไปแล้วซึ่งเป็นกรณีที่มีคำตอบส่วนใหญ่สำหรับคำถามที่คล้ายกันที่นี่ แต่นั่นไม่ได้ช่วยอะไร

แก้ไข:

ฉันแก้ไขInvalid Object nameข้อผิดพลาดโดยการป้องกันไม่ให้สร้างตารางเมทาดาทาลงในฐานข้อมูลหลักโดยการขยายDefaultBatchConfigurerคลาสและการแทนที่setDataSourceเมธอดซึ่งจะสร้างขึ้นในที่เก็บแผนที่ในหน่วยความจำ ตอนนี้ฉันต้องการลองสองตัวเลือก:

  1. วิธีสร้างตารางข้อมูลเมตาในฐานข้อมูลในเครื่องหรือฐานข้อมูลในหน่วยความจำเช่น h2db
  2. หรือถ้าฉันมีตารางข้อมูลเมตาที่สร้างไว้แล้วในฐานข้อมูลหลักในสคีมาที่แตกต่างจากตารางหลักของฉันที่ฉันดึงมา วิธีชี้งานของฉันไปที่ตารางข้อมูลเมตาเหล่านั้นในสคีมาอื่นเพื่อจัดเก็บข้อมูลงานและรายละเอียดขั้นตอนในตารางเหล่านั้น
@Configuration
public class SpringBatchConfig extends DefaultBatchConfigurer{

@Override
    public void setDataSource(DataSource datasource) {

    }
...

ไฟล์ application.properties ของฉันมีลักษณะดังนี้:

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

คำตอบ

MahmoudBenHassine Oct 02 2020 at 07:57

วิธีสร้างตารางข้อมูลเมตาในฐานข้อมูลในเครื่องหรือฐานข้อมูลในหน่วยความจำเช่น h2db

คุณสามารถใช้spring.batch.initialize-schema=embeddedสำหรับสิ่งนั้น

หรือถ้าฉันมีตารางข้อมูลเมตาที่สร้างไว้แล้วในฐานข้อมูลหลักในสคีมาที่แตกต่างจากตารางหลักของฉันที่ฉันดึงมา วิธีชี้งานของฉันไปที่ตารางข้อมูลเมตาเหล่านั้นในสคีมาอื่นเพื่อจัดเก็บข้อมูลงานและรายละเอียดขั้นตอนในตารางเหล่านั้น

ชุดสปริงทำงานกับแหล่งข้อมูลไม่ใช่สคีมาเฉพาะ หากตารางข้อมูลเมตาอยู่ในสคีมาอื่นคุณจะต้องสร้างแหล่งข้อมูลที่สองที่ชี้ไปยังสคีมานั้นและตั้งค่าบนที่เก็บงาน

JosephXu Oct 09 2020 at 06:45

ฉันได้สร้างการสาธิตที่มีแหล่งข้อมูลสองแหล่ง ข้อมูลเมตาแบบกลุ่มจะอยู่ใน H2 DB และแหล่งข้อมูลของงานคือ Azure SQL

นี่คือโครงสร้างโครงการ:

  1. เราจำเป็นต้องกำหนดDataSourceConfigคลาสและใช้@Primaryคำอธิบายประกอบสำหรับ DataSource bean:
@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 เราใช้@Autowired @Qualifier("mssqlDataSource")เพื่อระบุ dataSource ในงาน Spring Batch:
@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. นี่คือ 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 ของฉัน อย่างไรก็ตามชื่อผู้ใช้ Azure sql ของฉันไม่มีสิทธิ์สร้างสำหรับฐานข้อมูล
    ผลแสดง: