복붙노트

[SPRING] 스프링 배치를 구성하여 메타 데이터를 저장하기위한 배치 테이블을 자동으로 생성하지 않으려면 어떻게해야합니까?

SPRING

스프링 배치를 구성하여 메타 데이터를 저장하기위한 배치 테이블을 자동으로 생성하지 않으려면 어떻게해야합니까?

JPA를 사용하여 PostGres 데이터베이스에서 CURD 작업을 수행하는 스프링 배치 작업을하고 있습니다. 스프링 부트 2.1.3을 사용하고 있습니다. 일괄 처리 작업 메타 데이터 정보를 저장하기 위해 Postgres 데이터베이스를 사용하기 위해 Spring 배치를 사용하지 않도록하기 위해 아래의 구성을 추가 했음에도 불구하고 아래와 같은 "오류"관계 : batch_job_instance가 존재하지 않습니다. 또한 나는 여기에 언급 된 해결책을 따라왔다. 누구든지 추가적으로 수행해야 할 작업을 제안 할 수 있습니까?

hibernate.temp.use_jdbc_metadata_defaults=false
spring.batch.initialize-schema=never
spring.batch.initializer.enabled=false

예외:

 Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]; nested exception is org.postgresql.util.PSQLException: ERROR: relation "batch_job_instance" does not exist
  Position: 39
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:234)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
    at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1444)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:632)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:669)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:700)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:712)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:768)
    at org.springframework.batch.core.repository.dao.JdbcJobInstanceDao.getJobInstance(JdbcJobInstanceDao.java:148)
    at org.springframework.batch.core.repository.support.SimpleJobRepository.getLastJobExecution(SimpleJobRepository.java:297)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy69.getLastJobExecution(Unknown Source)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:101)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy78.run(Unknown Source)
    at com.test.BatchApplication.main(BatchApplication.java:28)
Caused by: org.postgresql.util.PSQLException: ERROR: relation "batch_job_instance" does not exist
  Position: 39
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:143)
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:106)
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:678)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617)
    ... 31 more

해결법

  1. ==============================

    1.스프링 부트 (Spring Boot)에 메타 데이터 테이블을 생성하지 말라고 지시했기 때문에, 데이터 소스에서 수동으로 테이블을 생성해야한다. Postgres의 경우 작업을 실행하기 전에 데이터베이스에서 schema-postgresql.sql 스크립트를 실행해야합니다.

    스프링 부트 (Spring Boot)에 메타 데이터 테이블을 생성하지 말라고 지시했기 때문에, 데이터 소스에서 수동으로 테이블을 생성해야한다. Postgres의 경우 작업을 실행하기 전에 데이터베이스에서 schema-postgresql.sql 스크립트를 실행해야합니다.

    편집 : 메타 데이터 테이블을 유지하지 않으려면 메모리 내장 맵 기반 작업 영역을 사용할 수 있습니다.

    @Configuration
    @EnableBatchProcessing
    public class MyJobConfiguration extends DefaultBatchConfigurer {
    
        @Override
        protected JobRepository createJobRepository() throws Exception {
            MapJobRepositoryFactoryBean factoryBean = new MapJobRepositoryFactoryBean();
            factoryBean.afterPropertiesSet();
            return factoryBean.getObject();
        }
    
        // other beans related to job definition
    }
    

    지도 기반 작업 저장소는 프로덕션 용도로 사용되지 않습니다.

    JDBC 기반 작업 저장소를 사용하지만 HSQLDB, H2 등의 내장 데이터베이스를 사용하는 또 다른 옵션입니다.

    희망이 도움이됩니다.

  2. from https://stackoverflow.com/questions/54950551/how-to-configure-spring-batch-not-to-auto-create-batch-tables-for-storing-meta-d by cc-by-sa and MIT license