【发布时间】:2017-03-14 00:17:02
【问题描述】:
我正在尝试寻找最佳方式来配置我的 Spring Boot Web 应用程序,以便在以下数据源之间轻松切换以进行本地测试和部署。
- 内存数据库中的 H2。仅限本地测试。
- 开发预言机。本地测试和部署。
- 产品预言机。仅限部署。
本地测试是指在 IDE 环境(Eclipse)中进行测试。 Dev 和 prod oracle 数据库设置在两个远程服务器上。
经过一些研究,从一个数据源切换到另一个数据源有不同的方法。
- 使用弹簧配置文件。 Using H2 and Oracle with Spring Boot。在类路径、application.properties、application-h2 中设置以下文件。属性和应用程序-dev.properties。虽然 h2 和 dev 的连接在相应的属性文件中定义,
spring.profiles.active在 application.properties 中设置。我的理解是在构建过程中可以通过指定spring.profiles.active覆盖这个属性。但是,它似乎是一个JVM变量,我如何设置它运行maven? - Maven 配置文件。在 pom 中创建多个配置文件和指向应用程序属性文件的过滤器。在 maven 构建期间由
-P选项指定的配置文件将确定要查看的应用程序属性文件。但是,根据maven application with multi environment configuration can't deploy on tomcat 的说法,这将为不同的部署产生多个战争。所以首选方法1。另外,它不适用于在本地测试时切换数据源。 - 持久性单位。在persistence.xml 中为不同的数据源定义不同的持久化单元。通过选择特定单位来使用 EntityManager。此方法的变体包括在单元名称中使用一个变量,该变量在 application.properties 中确定。
- JNDI 查找。在 application.properties 中使用
spring.datasource.jndi-name设置 jndi 名称。包括 url 和凭据在内的实际数据库信息将在将部署战争的 tomcat 文件夹中的 context.xml 中指定。
我的注意力集中在本地测试环境上。将采用方法 1。只需更改 application.properties 中的属性,即可轻松在内存中的 H2 和 oracle 之间切换。由于测试通常在 IDE 中完成,因此不需要生成 war,尽管欢迎使用 spring.profiles.active 运行 maven install 来回答。
就部署而言,JNDI 绝对是要走的路。但是,我担心 application.properties 中的两个属性:spring.profiles.active 和 spring.datasource.jndi-name 可能会相互冲突。如果我有spring.profiles.active=h2 然后尝试将战争部署到 prod 服务器,它是尝试基于 spring 配置文件连接到 h2 还是基于 jdni-name 连接到 prod db?以足够的灵活性适应所有场景的最佳实践是什么?
还需要一个显式的DataSource 配置类,例如Configure Mutiple DataSource in Spring Boot with JNDI?我的理解是 application.properties 和 spring profile 应该足够处理了吧?
【问题讨论】:
标签: spring-boot persistence datasource jndi spring-profiles