【问题标题】:Setup Spring Boot application to connect to different data source depending on environment parameter for the session根据会话的环境参数设置 Spring Boot 应用程序以连接到不同的数据源
【发布时间】:2019-01-12 20:12:28
【问题描述】:

我目前正在构建一个 Spring Boot 应用程序,该应用程序需要与三个不同的数据库环境一起工作并以与环境无关的方式运行。

  • “dev”环境将使用本地 sqlite 数据库。

  • “uat”环境将使用 postgres 数据库。

  • “实时”环境将使用 sql 数据库。

在加载时,我的应用程序会检查环境参数是否存在:

  • 如果没有设置或环境参数为 dev,那么它将创建一个本地 sqlite 数据库并在会话期间建立与它的连接。

  • 如果设置为 uat,则将建立与 heroku postgres 数据库的连接。

  • 如果设置为 live,则将建立到 mysql 数据库的连接。

现在我正在努力在 Java 上将其概念化。

这是我到目前为止编写的代码,我在其中获取环境参数。除此之外我不确定。

@SpringBootApplication
public class Launcher implements CommandLineRunner {

    public static void main(String args[]) {
        SpringApplication.run(Launcher.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        String currentEnvironment = System.getenv("CURRENT_ENV");

        // if current env is null or dev, set up sqlite database (if it doesnt already exist and use this for the remainder of the session

        // if uat connect to heroku postgres db

        // if live then connect to mysql db
    }
}

【问题讨论】:

    标签: java mysql postgresql sqlite spring-boot


    【解决方案1】:

    这就是在 spring 中创建配置文件的目的,Spring Boot 允许您拥有可以帮助您的应用程序在不同环境中运行的配置文件。

    因此,在您的情况下,您必须创建三个属性文件,例如

    1. dev.properties
    2. uat.properties
    3. live.properties

    在每个属性文件中,您必须设置开发所需的配置。然后只需激活您想要使用的配置文件。

    spring.profiles.active=dev
    

    对于每一个我都会创建一个@Configuration 类。

    @Profile("dev")
    @Configuration
    public class DevConfiguration{
       ...
    }
    
    @Profile("uat")
    @Configuration
    public class UatConfiguration{
       ...
    }
    
    @Profile("live")
    @Configuration
    public class LiveConfiguration{
       ...
    }
    

    我想提一下Felipe Gutierrez 的一本好书Pro Spring Boot,它可以教给你很多东西。

    【讨论】:

    • 感谢您的回复。你能给我一个例子,说明我将如何在会话期间在你的代码中建立一个 sqlite 连接或 sql 连接。例如:pastebin.com/qGEA82WJ。我了解 spring 配置文件,但我不清楚如何在上下文中创建不同的数据库连接。
    • @methuselah 你在使用 JPA 吗?还是原生的jdbc?为什么你想要努力工作并建立你的联系和陈述......
    • @methuselah 这真的很难管理您的打开、关闭连接语句、结果集事务(如果有的话),我认为不迁移到 JPA 确实是个坏主意,您是否熟悉 JdbcTemplate 但是你仍然把你的配置放在每个属性文件中,是你的意思吗?
    【解决方案2】:

    我认为真正的问题是:您如何指定您的环境?

    借助 Spring Boot,您可以使用多个应用程序属性文件。在您的情况下,您可以使用 3 个文件:

    • application.properties(用于开发环境)
    • application-uat.properties(用于 uat 环境)
    • application-live.properties(用于实时环境)。

    您也可以使用 YAML 文件来执行此操作。

    有很多方法可以让 SpringBoot 选择正确的环境属性文件。

    您有很多方法可以选择正确的环境文件。

    例如,如果每个环境都使用 tomcat,您可以设置属性 spring.profiles.active 例如JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=ENV_NAME"(在 setclasspath.bat 中(如果您在 [l]unix 上,则为 setclasspath.sh),其中 ENV_NAME 可以是 uat 或 live。

    【讨论】:

    • 我通过环境变量指定我的环境。请参阅问题中截断的代码。谢谢
    猜你喜欢
    • 2019-12-16
    • 1970-01-01
    • 2020-10-26
    • 2016-11-15
    • 2020-04-28
    • 2018-09-11
    • 2016-10-22
    • 2022-08-18
    • 2019-12-14
    相关资源
    最近更新 更多