连接字符串中的 Spring Profiles

Posted

技术标签:

【中文标题】连接字符串中的 Spring Profiles【英文标题】:Spring Profiles in connection String 【发布时间】:2020-03-30 07:53:17 【问题描述】:

我正在使用 Spring BootDocker。我正在使用 connectionService.java 返回 connection 来执行某些任务。这个连接字符串有jdbc:mysql://localhost/databaseName?autoReconnect=true&useSSL=false。如果我正在运行应用程序,则它运行良好,但如果我构建 docker 映像,则此连接字符串应替换为 jdbc:mysql://docker-mysql/databaseName?autoReconnect=true&useSSL=false。因为 docker-image 的配置是 docker-mysql 而不是 localhost

ConnectionService.java

@Service
public class ConnectionService 
    public Connection createConnection() throws SQLException 
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/databaseName?autoReconnect=true&useSSL=false", "root", "root");
        return connection;
    

Docker-compose

version: '3'

services:
  docker-mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=databaseName
      - MYSQL_USER=root
      - MYSQL_PASSWORD=root
    ports:
      - 3307:3306

  app:
    image: app:latest
    ports:
      - 8080:8080
    depends_on:
      - docker-mysql
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://docker-mysql/databaseName?autoReconnect=true&useSSL=false
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=root

错误:马上。我遇到了错误通信链接故障。 我怎么能做到这一点,相同的代码适用于运行应用程序以及构建 docker 映像时。

【问题讨论】:

【参考方案1】:

您在 Docker-compose 中设置了 SPRING_DATASOURCE_URL 环境变量,但不要在您的 ConnectionService 中使用它。

也许,您可以使用 Spring 中的 System.getEnv() 或 @Value 注解。

修改你的 ConnectionService 类:

@Value("$spring.datasource.url")
private String datasourceUrl;

Connection connection = DriverManager.getConnection(datasourceUrl, "root", "root");

【讨论】:

更新了我的答案。 这适用于 docker-image 但我如何也可以将相同的代码用于“运行应用程序”? 你可以在你的 application.yml/properties 中设置它所以,当你在本地机器上运行时,该值将从你的配置文件中读取,当你在 docker 中运行时,环境变量会覆盖它.

以上是关于连接字符串中的 Spring Profiles的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 多环境配置

为啥 environment.getProperty("spring.profiles.active") 在使用 @ActiveProfiles 激活测试中的配置文件时返回 nul

BlueTooth Profiles

spring.profiles.include 跟 spring.profiles.active 的区别

spring.profiles.active=@profiles.active@的含义

Spring.profiles多环境配置最佳实践