问题 基于环境的Spring数据源


我正在尝试配置我的Spring Boot应用程序,以便在存在某些环境变量时使用特定的数据源。例如,如果 MY_PROD_DATASOURCE 环境变量存在,我想用我的生产数据源;否则,我想使用我的本地数据源(相同类型)。

我已经发现 Spring参考中的一些东西 这解释了如何在我的声明中声明单个数据源 application.properties。具体来说,MySQL数据源可能如下所示:

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driverClassName=com.mysql.jdbc.Driver

但是,我没有看到如何在此文件中有条件地更改数据源属性。还有另一种方法吗?


10296
2017-12-01 17:08


起源

您可以使用不同的数据源文件定义多个会话工厂。 stackoverflow.com/questions/20541736/... - Aditya Peshave
你可以再扩展一点吗?也许在答案中? - nmagerko


答案:


在Spring Boot中,您可以:

  1. 外部化 application.properties 从您的jar并通过添加路径作为启动参数为每个环境提供文件:

    java -jar your-app.jar --spring.config.location=/path/to/app.properties
    
  2. 使用Spring配置文件。创建 application-${profile}.properties 对于每个配置文件,在每个不同的数据源属性中

  3. 使用Spring配置文件而不是 application.properties,把你的属性 application.yaml 您可以使用约定为所有环境添加属性,如下所示:

    spring:
        profiles: development
    server:
        port: 9001
    
    ---
    
    spring:
        profiles: production
    server:
        port: 0
    
  4. 使用环境变量并设置 SPRING_DATASOURCE_URLSPRING_DATASOURCE_USERNAMESPRING_DATASOURCE_PASSWORD和(可选) SPRING_DATASOURCE_DRIVER_CLASS_NAME

有关详细信息,请参阅Spring Boot参考部分 如何根据环境更改配置 和 外部配置


12
2017-12-01 17:30



这看起来像我正在努力做的!但是,我有一个后续问题:这是否意味着我不能使用 @Configuration 和/或 @EnableAutoConfiguration 我的应用中的注释? - nmagerko
你可以而且你应该。 - Maciej Walkowiak