application.yml
spring: datasource: ###会员数据库 member: jdbc-url: jdbc:mysql://localhost:3306/user username: root password: root driver-class-name: com.mysql.jdbc.Driver ###订单数据库 order: jdbc-url: jdbc:mysql://localhost:3306/order username: root password: root driver-class-name: com.mysql.jdbc.Driver
|
备注:如果是SpringBoot2配置多数据源 ,报如下错误:
“jdbcUrl is required with driverClassName.”或者Cause: java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.] with root cause
解决方案:
spring.datasource.url 和spring.datasource.driverClassName,换成
spring.datasource.jdbc-url和spring.datasource.driver-class-name
数据库数据源相关配置
会员数据源
@Configuration @MapperScan(basePackages = "com.member.mapper", sqlSessionFactoryRef = "memberSqlSessionFactory") public class MemberDataSourceConfig {
/** * 将会员db注册到容器中 * * @return */ @Bean(name = "memberDataSource") @ConfigurationProperties(prefix = "spring.datasource.member") public DataSource memberDataSource() { return DataSourceBuilder.create().build(); }
/** * 将会员SqlSessionFactory注册到容器中 * * @param dataSource * @return * @throws Exception */ @Bean(name = "memberSqlSessionFactory") public SqlSessionFactory memberSqlSessionFactory(@Qualifier("memberDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(memberDataSource()); return sqlSessionFactoryBean.getObject(); }
/** * 创建会员管理器 * * @param dataSource * @return */ @Bean(name = "memberTransactionManager") public DataSourceTransactionManager memberTransactionManager(@Qualifier("memberDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }
/** * 创建订单sqlSesion模版 * * @param sqlSessionFactory * @return * @throws Exception */ @Bean(name = "memberSqlSessionTemplate") public SqlSessionTemplate menberSqlSessionTemplate( @Qualifier("memberSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); }
}
|
订单数据源
@Configuration @MapperScan(basePackages = "com.order.mapper", sqlSessionFactoryRef = "orderSqlSessionFactory") public class OrderDataSourceConfig {
/** * 将订单db注册到容器中 * * @return */ @Bean(name = "orderDataSource") @ConfigurationProperties(prefix = "spring.datasource.order") public DataSource orderDataSource() { return DataSourceBuilder.create().build(); }
/** * 将订单SqlSessionFactory注册到容器中 * * @param dataSource * @return * @throws Exception */ @Bean(name = "orderSqlSessionFactory") public SqlSessionFactory orderSqlSessionFactory(@Qualifier("orderDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(orderDataSource()); return sqlSessionFactoryBean.getObject(); }
/** * 创建订单管理器 * * @param dataSource * @return */ @Bean(name = "orderTransactionManager") public DataSourceTransactionManager orderTransactionManager(@Qualifier("orderDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }
/** * 创建订单sqlSesion模版 * * @param sqlSessionFactory * @return * @throws Exception */ @Bean(name = "orderSqlSessionTemplate") public SqlSessionTemplate menberSqlSessionTemplate( @Qualifier("orderSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); }
}
|
4.4.2创建分包Mapper
会员mapper
public interface MemberMapper { @Insert("insert into users values(null,#{name},#{age});") public int addUser(@Param("name") String name, @Param("age") Integer age); }
|
订单mapper
public interface OrderMapper { @Insert("insert into order_number values(null,#{number});") int inserOrder(@Param("number") String number); }
|
如果多数据源使用事务报错的话
cted single matching bean but found 2: memberTransactionManager,orderTransactionManager
@Transactional(transactionManager = "memberTransactionManager")
明确指定使用那个事务管理器即可
@EnableConfigurationProperties({OrderConfig.class, MemberConfig.class})