web-dev-qa-db-ja.com

データベースがダウンしている場合でもSpringサーバーを起動するにはどうすればよいですか?

Spring Boot(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

何か方法はありますか?

ありがとう

17
Cs lee

以下を設定できます。

spring.datasource.continue-on-error=true

あなたのapplication.propertiesで。

Spring Boot 2.2.4ユーザーガイドによると

デフォルトでは、Spring BootはSpring JDBCイニシャライザのフェイルファスト機能を有効にします。つまり、スクリプトによって例外が発生すると、アプリケーションの起動に失敗します。この動作を調整するには、spring.datasource.continue-on-errorを設定します。

13
Ortomala Lokni

追加する必要があります

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

それを機能させるために

3
Luca Carducci

私はこれを解決することができました。しかし、私が機能したものと問題のコードとの主な違いの1つは、接続プールに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-idle to 0を設定すると、ひかりは接続なしで幸せになります。

initialization-fail-timeout設定を-1にすると、プールが起動したときに接続を取得したくないことがHikariに通知されます。

HikariCPドキュメント から:

ゼロ未満の値は、最初の接続試行をバイパスし、プールはバックグラウンドで接続を取得しようとしている間すぐに開始されます。その結果、後で接続を取得しようとすると失敗することがあります。

continue-on-error設定trueを使用すると、エラーが発生した場合でもサービスを続行できます。

両方のdriver-class-nameおよびdatabase-platformが必要でした。それ以外の場合、ひかりはデータベースに接続して(起動時に)これらの値を見つけようとします。


ただし、何か不足している場合に備えて、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
0
Danny Wedul