应用场景
项目需要同时连接两个不同的数据库poi、pos,暂未涉及到主从,仅仅是因为两个数据库相互独立。
多数据源
首先要将spring boot自带的DataSourceAutoConfiguration
禁掉,因为它会读取application.properties
文件的spring.datasource.*
属性并自动配置单数据源。在@SpringBootApplication
注解中添加exclude
属性即可:
1 | (exclude = { |
然后在application.yml
中配置多数据源连接信息:
1 | spring: |
由于我们禁掉了自动数据源配置,因些下一步就需要手动将这些数据源创建出来:
poi数据源配置
注意,配置类需要对DataSource
、DataSourceTransactionManager
、SqlSessionFactory
、SqlSessionTemplate
四个数据项进行配置;DataSource
类型需要引入javax.sql.DataSource
@MapperScan
对指定dao包建立映射,确保在多个数据源下,自动选择合适的数据源,而在service层里不需要做特殊说明.
1 |
|
经过如上配置,cn.caoler.poi.mapper
包下的Mapper接口,都会使用poi数据源。同理可配第二个
pos数据源配置
1 |
|
完成这些配置后,假设有2个Mapper poi.mapper.UserMapper
和pos.mapper.RoleMapper
,使用前者时会自动连接poi库,后者连接pos库。
踩坑
1. jdbcUrl is required with driverClassName报错
解决方法:在配置文件中使用spring.datasource.jdbcUrl,而不是通常使用的spring.datasource.url。
1 | datasource: |
2. 访问 接口时提示:DataSourceTransactionManager 重复
1 | "posTransactionManager") (name = |
在配置DataSourceTransactionManager时,Bean命名为posTransactionManager和poiTransactionManager,已经做了区分,但是调用时还会提示有两个TransactionManager,产生原因暂不明确,但是解决方法为: 修改函数名,保证函数名之间有严格区分即可(例:setTransactionManager1
、setTransactionManager2
)
3. 提示mapper/xxx/*.xml未找到
只要保证程序运行之前,上述位置生成好对应的mapping.xml文件即可,若该位置无xml文件,则会报上述错误。
至此,大功告成。