如何在 Spring Boot Application 中为本地测试和部署配置不同的数据源

How to configure different data sources for local testing and deployment in Spring Boot Application

我正在尝试找到配置我的 Spring Boot Web 应用程序的最佳方法,以便在本地测试和部署的以下数据源之间轻松切换。

  1. 内存数据库中的 H2。仅限本地测试。
  2. 开发神谕。本地测试和部署。
  3. 产品神谕。仅限部署。

本地测试,我的意思是在IDE环境(Eclipse)下测试。 Dev 和 prod oracle 数据库设置在两个远程服务器上。

经过一些研究,有多种方法可以从一个数据源切换到另一个数据源。

  1. 使用 Spring 配置文件。 Using H2 and Oracle with Spring Boot。在classpath、application.properties、application-h2中设置以下文件。属性和应用程序-dev.properties。 h2 和 dev 的连接是在相应的属性文件中定义的,而 spring.profiles.active 是在 application.properties 中设置的。我的理解是 属性 可以在构建过程中通过指定 spring.profiles.active 来覆盖。不过好像是JVM变量,怎么设置运行ning maven?
  2. Maven 配置文件。在 pom 中创建多个配置文件和一个指向应用程序属性文件的过滤器。在 Maven 构建期间由 -P 选项指定的配置文件将决定要查找的应用程序属性文件。但是,根据 ,这将针对不同的部署生成多个 war。所以首选方法1。另外,它不适用于在本地测试时切换数据源。
  3. 持久性单位。在 persistence.xml 中为不同的数据源定义不同的持久化单元。通过选择特定单位来使用 EntityManager。此方法的变体包括在 application.properties.
  4. 中确定的单位名称中有一个变量
  5. JNDI 查找。在 application.properties 和 spring.datasource.jndi-name 中设置一个 jndi 名称。包括 url 和凭据在内的实际数据库信息将在将部署 war 的 tomcat 文件夹中的 context.xml 中指定。

我的想法是本地测试环境。继续方法1。只需更改application.properties中的属性即可轻松在内存中的H2和oracle之间切换。由于测试通常在 IDE 中完成,因此不需要生成 war,尽管欢迎回答 运行 maven install with spring.profiles.active

就部署而言,JNDI 绝对是最佳选择。但是,我担心 application.properties 中的两个属性:spring.profiles.activespring.datasource.jndi-name 可能相互冲突。如果我有 spring.profiles.active=h2 然后尝试将 war 部署到 prod 服务器,它会尝试连接到基于 spring 配置文件的 h2 还是基于 jdni-name 的 prod db?以足够的灵活性适应所有场景的最佳实践是什么?

是否还需要为 DataSource 显式配置 class,例如 ?我的理解是 application.properties 和 spring 配置文件应该足以处理它,对吧?

  • 绝对使用 Spring 个配置文件。
  • 您不想使用 Maven 配置文件,因为它会创建不同的工件。询问您的 QA/Release 工程师,他们对针对不同环境使用不同工件有何感想 :)。他们会不高兴的。
  • H2 也是您想要在 CI 服务器集成测试中使用的。这样的集成测试又快又简单。
  • 与其在 application.properties 中更改配置文件,不如考虑通过命令行参数定义配置文件。因此,运行 您在不同配置文件中的应用程序不需要更改配置文件。