Using one datasource only in a Spring Boot application is very straight forward. However, using multiple datasources in an application is anything but! It took me quite a bit of googling and fiddling to find a solution that worked.
To use two datasources, you need to set one up as primary. The second datasource will then become the secondary. You set a datasource as the primary by using the primary attribute. Below is an example using XML based configuration
<bean id="greenDataSource" primary="true" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> <property name="url" value="${db.green.url}"/> <property name="username" value="${db.green.username}"/> <property name="password" value="${db.green.password}"/> </bean>
Then define the secondary datasource like this:
<bean id="purpleDataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> <property name="url" value="${db.purple.url}"/> <property name="username" value="${db.purple.username}"/> <property name="password" value="${db.purple.password}"/> </bean>
You can then wire them into your Java classes using the @Autowired and @Primary annotations:
@Repository public class AwesomeDaoImpl implements AwesomeDao { private JdbcTemplate greenJdbcTemplate; private JdbcTemplate purpleJdbcTemplate; @Autowired @Primary public void setGreenDataSource(DataSource greenDataSource) { this.greenJdbcTemplate = new JdbcTemplate(greenDataSource); } @Autowired public void setPurpleDataSource(DataSource purpleDataSource) { this.ipdcJdbcTemplate = new JdbcTemplate(purpleDataSource); } }
I haven’t figured out how to plumb in more than two datasources without using JNDI. If JNDI is available, then your Spring Boot application can access all the JDNI datasources using the @Resource annotation.
@Repository public class ColourDaoImpl implements ColourErrorDao { private JdbcTemplate jdbcTemplate; @Resource(mappedName = "java:jboss/datasources/Green") public void setGreenDataSource(DataSource greenDataSource) { this.jdbcTemplate = new JdbcTemplate(greenDataSource); } }