Spring Datasources based on Environment

database, java, spring, spring-boot

Solution

In Spring Boot you can:

Externalize `application.properties` from your jar and provide file per environment by adding path as a startup parameter:

java -jar your-app.jar --spring.config.location=/path/to/app.properties

Use Spring profiles. Create `application-${profile}.properties` for each profile, in each one different datasource properties

Use Spring profiles and instead of `application.properties`, put your properties to `application.yaml` where you can put properties for all environments using convention as below:

spring:
    profiles: development
server:
    port: 9001

---

spring:
    profiles: production
server:
    port: 0

Use environment variables and set `SPRING_DATASOURCE_URL`, `SPRING_DATASOURCE_USERNAME`, `SPRING_DATASOURCE_PASSWORD`, and (optionally) `SPRING_DATASOURCE_DRIVER_CLASS_NAME`.

Learn more in the Spring Boot reference section on How to change configuration depending on the environment and External Configuration.

Problem

I am trying to configure my Spring Boot application to use specific datasources when certain environmental variables exist. For example, if the `MY_PROD_DATASOURCE` environmental variable exists, I would like to use my production datasource; otherwise, I would like to use my local datasource (of the same type). I have found something in the Spring reference that explains how a single datasource could be declared in my `application.properties`. Specifically, a MySQL datasource could look like: ``` spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass spring.datasource.driverClassName=com.mysql.jdbc.Driver ``` However, I do not see how I could change the datasource properties conditionally in this file. Is there another way to do it?

Original source

Related problems