如果数据库关闭,如何使Spring服务器启动?

时间:2017-07-31 06:54:43

标签: java spring-boot fail-fast

我使用的是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

有什么办法吗?

由于

5 个答案:

答案 0 :(得分:7)

我能够解决这个问题。不过,我所使用的代码与问题代码之间的主要区别是,我在连接池中使用的是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可以使Hikari在没有任何联系的情况下感到高兴。

initialization-fail-timeout设置为-1告诉Hikari,当池启动时,我不希望它获得连接。

来自HikariCP documentation

小于零的值将绕过任何初始连接尝试,并且池将在尝试在后台获取连接时立即启动。因此,以后获得连接的努力可能会失败。

continue-on-error设置true允许服务即使遇到错误也可以继续。

driver-class-namedatabase-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

答案 1 :(得分:5)

您可以设置:

spring.datasource.continue-on-error=true
你的application.properties中的

根据Spring Boot 2.1.1 user guide

  

默认情况下,Spring Boot启用Spring JDBC初始化程序的快速失败功能。这意味着,如果脚本导致异常,则应用程序无法启动。您可以通过设置spring.datasource.continue-on-error

来调整该行为

答案 2 :(得分:2)

您需要添加

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

为了使它起作用

答案 3 :(得分:1)

当你构建你的应用时,你可以添加

mvn clean install -DskipTests

它会跳过数据库连接的测试

(-D 用于定义系统属性)

答案 4 :(得分:0)

请查看此博客文章,以找到一种非常好的解决方案:Delay startup of your Spring Boot application until your DB is up