Как заставить 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

Там в любом случае?

Спасибо

6 ответов

Решение

Вы можете установить:

spring.datasource.continue-on-error=true

в вашем приложении. свойства.

Согласно руководству пользователя Spring Boot 1.4.7:

Чтобы отключить быстрый отказоустойчивый, вы можете установить spring.datasource.continue-on-error = true. Это может быть полезно после того, как приложение несколько раз развернулось и было развернуто, поскольку сценарии могут действовать как "миграции бедняков" - неудачные вставки означают, что данные уже есть, поэтому не нужно препятствовать тому, чтобы приложение работает, например.

Я смог это решить. Однако одно из основных различий между тем, что у меня получилось, и кодом в вопросе заключается в том, что я использую Hikari вместо Tomcat для пула соединений.

Вот основные настройки, которые мне пришлось сделать:

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-idle до 0 позволяет Хикари быть счастливой без каких-либо связей.

В initialization-fail-timeout установка -1 говорит Hikari, что я не хочу, чтобы он получал соединение при запуске пула.

Из документации HikariCP:

Значение меньше нуля пропустит любую первоначальную попытку подключения, и пул запустится немедленно при попытке получить подключения в фоновом режиме. Следовательно, последующие попытки установить соединение могут потерпеть неудачу.

В 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

И у моего проекта есть следующие зависимости Spring Boot:

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

чтобы заставить это работать

Когда вы создаете свое приложение, вы можете добавить это

      mvn clean install -DskipTests

он пропустит тесты подключения к базе данных

(-D используется для определения системного свойства)

Если советы выше не помогли и вы используете jpa, то установите

      spring.jpa.hibernate.ddl-auto=none

это сработало для меня.

Посмотрите это сообщение в блоге, чтобы найти очень хорошее решение: отложить запуск приложения Spring Boot до тех пор, пока ваша БД не будет готова.

Другие вопросы по тегам