programing

데이터베이스가 다운된 경우에도 Spring 서버를 부팅하려면 어떻게 해야 합니까?

cafebook 2023. 3. 29. 21:53
반응형

데이터베이스가 다운된 경우에도 Spring 서버를 부팅하려면 어떻게 해야 합니까?

스프링 부츠(1.4.7)와 MyBatis를 사용하고 있습니다.

spring.main1.datasource.url=jdbc:mariadb://192.168.0.11:3306/testdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&socketTimeout=5000&connectTimeout=3000
spring.main1.datasource.username=username
spring.main1.datasource.password=password
spring.main1.datasource.driverClassName=org.mariadb.jdbc.Driver
spring.main1.datasource.tomcat.test-on-borrow=true
spring.main1.datasource.tomcat.test-while-idle=true
spring.main1.datasource.tomcat.validation-query=SELECT 1
spring.main1.datasource.tomcat.validation-query-timeout=5000
spring.main1.datasource.tomcat.validation-interval=5000
spring.main1.datasource.tomcat.max-wait=5000
spring.main1.datasource.continue-on-error=true

Eclipse 또는 Linux 서버에서 데이터베이스 연결이 끊어진 경우 오류가 발생하여 프로그램을 시작할 수 없습니다(데이터베이스는 localhost에 없습니다).

연결이 끊긴 데이터베이스로 프로그램을 시작하려고 하면, 이것을 인쇄해 주세요.

java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=192.168.0.11)(port=3306)(type=master) : connect timed out
Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=192.168.0.11)(port=3306)(type=master) : connect timed out
Stopping service [Tomcat]
Application startup failed

무슨 방법이 없을까요?

감사해요.

설정할 수 있는 것은 다음과 같습니다.

spring.sql.init.continue-on-error=true

application.properties로 이동합니다.

Spring Boot 2.5.5 사용자 가이드에 따르면:

기본적으로는 Spring Boot을 사용하면 스크립트 기반 데이터베이스 이니셜라이저의 Fail-Fast 기능이 활성화됩니다.즉, 스크립트로 인해 예외가 발생하면 응용 프로그램이 시작되지 않습니다.이 동작은, 다음의 설정에 의해서 조정할 수 있습니다.spring.sql.init.continue-on-error.

추신: Spring Boot 2.5 이전부터 이 속성은spring.datasource.continue-on-error.

나는 이것을 해결할 수 있었다.다만, 작업 내용과 질문의 코드의 큰 차이는, 접속 풀에 Tomcat 대신 Hikari를 사용하고 있다는 것입니다.

주요 설정은 다음과 같습니다.

spring.datasource.hikari.minimum-idle: 0
spring.datasource.hikari.initialization-fail-timeout: -1
spring.datasource.continue-on-error: true
spring.datasource.driver-class-name: org.postgresql.Driver
spring.jpa.database-platform: org.hibernate.dialect.PostgreSQLDialect

설정minimum-idle0까지를 지정하면 히카리는 아무런 연결 없이 행복해질 수 있습니다.

initialization-fail-timeout설정 -1은 Hikari에게 수영장에서 불이 났을 때 연결이 되지 않았으면 좋겠다고 말합니다.

HikariCP 매뉴얼:

값이 0보다 작으면 초기 연결 시도가 모두 바이패스되며 백그라운드에서 연결을 시도하는 동안 풀이 즉시 시작됩니다.그 결과, 나중에 접속을 얻기 위한 노력은 실패할 수 있습니다.

continue-on-error설정true에러 발생시에도 서비스를 계속할 수 있습니다.

둘 다driver-class-name그리고.database-platform필수입니다.그렇지 않은 경우 Hikari는 (시작 시) 데이터베이스에 연결하여 이러한 값을 확인하려고 합니다.


단, 부족한 점이 있을 경우를 대비해서 전체 Spring 설정을 다음에 나타냅니다.

spring:
  application:
    name: <redacted>
  datasource:
    url: <redacted>
    username: <redacted>
    password: <redacted>
    driver-class-name: org.postgresql.Driver
    hikari:
      minimum-idle: 0
      maximum-pool-size: 15
      connection-timeout: 10000 #10s
      idle-timeout: 300000 #5m
      max-lifetime: 600000 #10m
      initialization-fail-timeout: -1
      validation-timeout: 1000 #1s
    continue-on-error: true
  jpa:
    open-in-view: false
    database-platform: org.hibernate.dialect.PostgreSQLDialect

또한 프로젝트에는 다음과 같은 스프링 부트 의존 관계가 있습니다.

org.springframework.boot:spring-boot
org.springframework.boot:spring-boot-actuator
org.springframework.boot:spring-boot-actuator-autoconfigure
org.springframework.boot:spring-boot-autoconfigure
org.springframework.boot:spring-boot-configuration-processor
org.springframework.boot:spring-boot-devtools
org.springframework.boot:spring-boot-starter
org.springframework.boot:spring-boot-starter-actuator
org.springframework.boot:spring-boot-starter-jdbc
org.springframework.boot:spring-boot-starter-jooq
org.springframework.boot:spring-boot-starter-json
org.springframework.boot:spring-boot-starter-logging
org.springframework.boot:spring-boot-starter-security
org.springframework.boot:spring-boot-starter-test
org.springframework.boot:spring-boot-starter-tomcat
org.springframework.boot:spring-boot-starter-validation
org.springframework.boot:spring-boot-starter-web

를 추가해야 합니다.

spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect

그것을 실현하기 위해서

위의 힌트가 도움이 되지 않고 jpa를 사용하는 경우,

spring.jpa.hibernate.ddl-auto=none

그것은 나에게 효과가 있었다.

앱을 만들 때 추가할 수 있습니다.

mvn clean install -DskipTests

데이터베이스 연결 테스트를 건너뜁니다.

(-D는 시스템속성을 정의하기 위해 사용됩니다.

언급URL : https://stackoverflow.com/questions/45409196/how-to-make-spring-server-to-start-even-if-database-is-down

반응형