programing

Spring Boot에서 예외 없이 데이터베이스 연결 대기

elecom 2023. 3. 14. 21:24
반응형

Spring Boot에서 예외 없이 데이터베이스 연결 대기

Spring Boot을 사용하여 마이크로 서비스를 만들고 싶습니다.지속성을 위해 mariadb 데이터베이스를 사용합니다.도커 컨테이너에서 실행되는 데이터베이스를 대기하기 위해 다음과 같은 코드를 구현했습니다.

@Bean
    public DatabaseStartupValidator databaseStartupValidator(DataSource dataSource) {
        var dsv = new DatabaseStartupValidator();
        dsv.setDataSource(dataSource);
        dsv.setTimeout(60);
        dsv.setInterval(7);
        dsv.setValidationQuery(DatabaseDriver.MYSQL.getValidationQuery());
        return dsv;
    }

코드가 매우 올바르게 동작하고 있습니다.애플리케이션은 데이터베이스 접속을 기다리고 있습니다.그러나 응용 프로그램 시작 시 예외가 발생합니다.

java.sql.SQLNonTransientConnectionException: Could not connect to Host ....
...
...
...

다음 행에서 데이터베이스를 대기한다는 정보를 얻을 수 있습니다.

021-04-07 21:29:40.816 INFO 16569 --- [ main] o.s.j.support.DatabaseStartupValidator : Database has not started up yet - retrying in 7 seconds (timeout in 57.65 seconds)

그 후, 애플리케이션은 예상대로 기동합니다.그럼 모든 게 잘 돌아가고 있는 것 같은데 예외를 억제하려면 어떻게 해야 하죠?링크된 문서에서는 예외 없이 작동해야 합니다."depends On Post Processor" 기능을 구현해야 합니까?어떤 종속성을 사용해야 합니까?미안, 멍청한 질문일 수도 있어. 난 봄 부츠에 처음이야.

이 예외를 없애려면 , 다음의 지시를 기술할 수 있습니다.application.properties파일:

logging.level.com.zaxxer.hikari=OFF

어플리케이션이 db에 접속할 수 없는 경우, 그 예외로 인해 잠시 후에 스프링이 크래시 되는 것에 주의해 주세요.또한 위의 지시에서는 Hikari와 관련된 로깅 액티비티를 볼 수 없습니다.

요약하면 시간 초과로 인해 응용 프로그램이 중단되기 전에 가능할 때까지 예외의 모양을 숨깁니다.

내가 사건을 좀 더 명확히 하길 바란다.

네, 실제로 데이터 소스에 의존하는 콩에 "의존"을 추가해야 합니다.메뉴얼의 다음의 부분에 주의해 주세요.

DataSource에 직접 액세스하는 Hibernate SessionFactory 또는 사용자 지정 데이터 액세스 개체와 같이 데이터베이스 부팅에 의존하는 콩에서 "depend-on"을 통해 참조됩니다.

내가 잘 이해한다면, 이것은 콩과 같은 콩이EntityManagerFactory이제 데이터베이스에 의존해야 합니다.DatabaseStartupValidatorbean 을 눌러 DB 부팅을 기다립니다.당신의 예외의 원인은 모르겠지만, 보통은EntityManagerFactory관련되므로 적어도 이 개체에 DependsOn을 추가해 보십시오.

링크된 기사는 다음과 같습니다.

@Bean
public static BeanFactoryPostProcessor dependsOnPostProcessor() {
    return bf -> {
        // Let beans that need the database depend on the DatabaseStartupValidator
        // like the JPA EntityManagerFactory or Flyway
        String[] flyway = bf.getBeanNamesForType(Flyway.class);
        Stream.of(flyway)
                .map(bf::getBeanDefinition)
                .forEach(it -> it.setDependsOn("databaseStartupValidator"));

        String[] jpa = bf.getBeanNamesForType(EntityManagerFactory.class);
        Stream.of(jpa)
                .map(bf::getBeanDefinition)
                .forEach(it -> it.setDependsOn("databaseStartupValidator"));
    };
}

반드시 필요한 것은 아닐 수도 있습니다.Flyway구성되었지만 주요 주의사항은 의존관계 자체가 빈 이름으로 참조된다는 것입니다.databaseStartupValidator콩을 만드는 방법의 이름입니다.

언급URL : https://stackoverflow.com/questions/66993064/wait-for-database-connection-in-spring-boot-without-an-exception

반응형