web-dev-qa-db-fra.com

Comment faire démarrer le serveur Spring même si la base de données est en panne?

J'utilise un Spring Boot (1.4.7) et 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

Je ne peux pas démarrer le programme avec des erreurs lorsque la base de données est déconnectée sur le serveur Eclipse ou Linux. (La base de données ne se trouve pas sur localhost.)

Lorsque j'essaie de démarrer le programme avec une base de données déconnectée, imprimez ceci.

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

Y a-t-il un moyen?

Merci

17
Cs lee

Vous pouvez définir:

spring.datasource.continue-on-error=true

dans votre application.properties.

Selon le Guide de l'utilisateur de Spring Boot 2.2.4 :

Par défaut, Spring Boot active la fonction de restauration rapide de l'initialiseur Spring JDBC. Cela signifie que si les scripts provoquent des exceptions, l'application ne démarre pas. Vous pouvez régler ce comportement en définissant spring.datasource.continue-on-error.

13
Ortomala Lokni

Vous devez ajouter

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

afin de le faire fonctionner

3
Luca Carducci

J'ai pu résoudre ce problème. Cependant, une différence principale entre ce que j'ai fait fonctionner et le code de la question est que j'utilise Hikari au lieu de Tomcat pour le pool de connexions.

Ce sont les paramètres clés que j'ai dû faire:

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

Réglage minimum-idle à 0 permet à Hikari d'être heureux sans aucune connexion.

Le initialization-fail-timeout le paramètre -1 indique à Hikari que je ne veux pas qu'il obtienne une connexion lorsque le pool se déclenche.

De la documentation HikariCP :

Une valeur inférieure à zéro contournera toute tentative de connexion initiale et le pool démarrera immédiatement tout en essayant d'obtenir des connexions en arrière-plan. Par conséquent, les efforts ultérieurs pour obtenir une connexion peuvent échouer.

Le continue-on-error setting true permet au service de continuer même en cas d'erreur.

Les driver-class-name et database-platform étaient requis. Sinon, Hikari essaie de comprendre ces valeurs en se connectant à la base de données (au démarrage).


Au cas où je manquerais quelque chose, voici ma configuration complète de 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

Et mon projet a les dépendances Spring Boot suivantes:

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
0
Danny Wedul