Spring在每次操作数据库的时候都会通过AbstractRoutingDataSource类中的determineTargetDataSource()方法获取当前数据源,所以可以通过继承AbstractRoutingDataSource并重写determineTargetDataSource()方法来实现多数据源的配置。
定义一个DynamicDataSource类,继承AbstractRoutingDataSource:
1 | package cc.mrbird.datasource; |
其中DatabaseContextHolder用于保存当前使用的数据库名称:
1 | package cc.mrbird.datasource; |
定义一个数据库名常量类:
1 | package cc.mrbird.datasource; |
dataSource1和dataSource2为在Spring上下文配置文件applicationContext.xml中配置的两个数据源:
1 | <bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource"> |
接着配置动态数据源,类型为上面定义的DynamicDataSource类:
1 | <bean id="dynamicDataSource" class="cc.mrbird.datasource.DynamicDataSource"> |
默认的数据源为dataSource1。
测试
使用Spring提供的jdbcTemplate进行测试,完整的applicationContext.xml配置如下:
1 |
|
编写TestDynamicDataSourceDao接口:
1 | package cc.mrbird.dao; |
其实现类:
1 | package cc.mrbird.dao.impl; |
编写Service接口及其实现类:
1 | package cc.mrbird.service; |
1 | package cc.mrbird.service.impl; |
在控制器中测试:
1 | package cc.mrbird.controller; |
页面访问/test路径,控制台输出:
1 | orcl |
总结
配置JdbcTemplate多数据源的核心在于初始化JdbcTemplate的时候数据源配置为动态数据源,就如xml配置的那样:
1 | <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" |
假如使用的是MyBatis,则只需要在配置sqlSessionFactory的时候指定数据源为动态数据源即可:
1 | <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="prototype"> |