spring: #数据库连接配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/springtest username: root password: root如果是采用properties配置文件的也是一样的:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springtest spring.datasource.username=root spring.datasource.password=root
spring: #数据库连接配置 datasource1: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1:3306/springtest2 username: root password: root datasource2: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1:3306/springtest username: root password: root这里有两个细节需要注意:
.因为我们目前采用的 springBoot2.5.2,默认的连接池为Hikari,该连接池数据源的地址字段为jdbc-url 而非 url。在只有单个数据源时,SpringBoot走默认数据源逻辑为我们把 url 与 jdbc-url 进行映射,保证我们获得数据源。此时我们自己设置的数据源没有进行映射处理,就需要保证字段符合Hikari的要求。否则会出现 java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName 异常
@Configuration @MapperScan(basePackages = "com.zhanfu.springboot.demo.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1") public class DataSource1Config { @Bean @ConfigurationProperties(prefix = "spring.datasource1") public DataSource dataSource1() { return DataSourceBuilder.create().build(); } @Bean public SqlSessionFactory sqlSessionFactory1() throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource1()); String locationPattern = "classpath*:/mapper1/*.xml"; PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern)); return sessionFactoryBean.getObject(); } @Bean(name = "sqlSessionTemplate1") public SqlSessionTemplate sqlSessionTemplate1(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }配置第二个数据源 DataSource2Config
@Configuration @MapperScan(basePackages = "com.zhanfu.springboot.demo.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2") public class DataSource2Config { @Bean @ConfigurationProperties(prefix = "spring.datasource2") public DataSource dataSource2() { return DataSourceBuilder.create().build(); } @Bean public SqlSessionFactory sqlSessionFactory2() throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource2()); String locationPattern = "classpath*:/mapper2/*.xml"; PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern)); return sessionFactoryBean.getObject(); } @Bean(name = "sqlSessionTemplate2") public SqlSessionTemplate sqlSessionTemplate2(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } @Bean(name = "productMapper") public ProductMapper mapper2(@Qualifier("sqlSessionTemplate2") SqlSessionTemplate sqlSessionTemplate) throws Exception { return sqlSessionTemplate.getMapper(ProductMapper.class); } }4. 事务管理器
@Configuration public class TransactionManagerConfig { @Autowired private DataSource dataSource1; @Autowired private DataSource dataSource2; @Bean public PlatformTransactionManager txManager1() { return new DataSourceTransactionManager(dataSource1); } @Bean public PlatformTransactionManager txManager2() { return new DataSourceTransactionManager(dataSource2); } }四、验证