记录 mybatis plus 配置多数据源的坑,结合浏览过的文章,并且一步步排错后,把问题定位到了多数据源配置文件上。我把浏览过的文章放到下面连接,如果按照作者的不做没解决,可根据下面的几篇文章进行排错。

参考文章连接

作者配置了两个数据源,数据源使用的是 阿里的 druid 数据源,我在下面贴出错误配置和正确配置。仅供参考。

错误配置
// 主数据源
@Configuration
@EnableConfigurationProperties(UserDataSourceProperties.class)
public class AuthDataSourceConfig {

    @Autowired
    private AuthDataSourceProperties properties;

    @Primary
    @Bean("authDataSource")
    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(properties.getDriverClass());
        dataSource.setUrl(properties.getUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());
        return dataSource;
    }

    @Primary
    @Bean(name = "authTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager(@Qualifier("authDataSource") DataSource authDataSource) {
        return new DataSourceTransactionManager(authDataSource);
    }

    @Primary
    @Bean("authSqlSessionFactory")
    public SqlSessionFactory getSqlSessionFactory(@Qualifier("authDataSource") DataSource authDataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(authDataSource);
        return sessionFactory.getObject();
    }
}

// 从数据源
@Configuration
@MapperScan(basePackages = "com.yutangcun.oauth.mapper.user", sqlSessionFactoryRef = "userSqlSessionFactory")
@EnableConfigurationProperties(UserDataSourceProperties.class)
public class UserDataSourceConfig {
    @Autowired
    private UserDataSourceProperties properties;

    @Bean("userDataSource")
    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(properties.getDriverClass());
        dataSource.setUrl(properties.getUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());
        return dataSource;
    }

    @Bean(name = "userTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager(@Qualifier("userDataSource") DataSource authDataSource) {
        return new DataSourceTransactionManager(authDataSource);
    }

    @Bean("userSqlSessionFactory")
    public SqlSessionFactory getSqlSessionFactory(@Qualifier("userDataSource") DataSource authDataSource) throws Exception {
    	// 错误配置只有这个地方
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(authDataSource);
        return sessionFactory.getObject();
    }
正确配置
// 主数据源
@Configuration
@EnableConfigurationProperties(UserDataSourceProperties.class)
public class AuthDataSourceConfig {

    @Autowired
    private AuthDataSourceProperties properties;

    @Primary
    @Bean("authDataSource")
    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(properties.getDriverClass());
        dataSource.setUrl(properties.getUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());
        return dataSource;
    }

    @Primary
    @Bean(name = "authTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager(@Qualifier("authDataSource") DataSource authDataSource) {
        return new DataSourceTransactionManager(authDataSource);
    }

    @Primary
    @Bean("authSqlSessionFactory")
    public SqlSessionFactory getSqlSessionFactory(@Qualifier("authDataSource") DataSource authDataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean ();
        sessionFactory.setDataSource(authDataSource);
        return sessionFactory.getObject();
    }
}

// 从数据源
@Configuration
@MapperScan(basePackages = "com.yutangcun.oauth.mapper.user", sqlSessionFactoryRef = "userSqlSessionFactory")
@EnableConfigurationProperties(UserDataSourceProperties.class)
public class UserDataSourceConfig {

    @Autowired
    private UserDataSourceProperties properties;

    @Bean("userDataSource")
    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(properties.getDriverClass());
        dataSource.setUrl(properties.getUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());
        return dataSource;
    }

    @Bean(name = "userTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager(@Qualifier("userDataSource") DataSource authDataSource) {
        return new DataSourceTransactionManager(authDataSource);
    }

    @Bean("userSqlSessionFactory")
    public SqlSessionFactory getSqlSessionFactory(@Qualifier("userDataSource") DataSource authDataSource) throws Exception {
    	// 正确配置
        final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(authDataSource);
        return sessionFactory.getObject();
    }

注意这里,有一个数据源,我是不需要用mybatis plus 所以我没有把 SqlSessionFactoryBean 换成 MybatisSqlSessionFactoryBea,如果两个数据源都需要用到mybatis plus 则参考 从数据源的配置,两个配置都是一样的,并且使用 @Primary 标识主数据源,不然会报错

修改数据源配置后,就解决了这个问题,世界也美好了。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐