SpringBoot项目多个数据源冲突

项目启动出错:

The bean 'dataSource', defined in class path resource [com/alibaba/druid/spring/boot/autoconfigure/DruidDataSourceAutoConfigure.class], could not be registered. A bean with that name has already been defined in class path resource [com/baomidou/dynamic/datasource/spring/boot/autoconfigure/DynamicDataSourceAutoConfiguration.class] and overriding is disabled.

这个错误表明在你的Spring Boot项目中,有两个配置类尝试定义名为dataSource的Bean,但是Spring Boot的默认行为是不允许同一个上下文中存在两个同名的Bean的,除非明确指定了允许覆盖(overriding)。

在这个具体的例子中,DruidDataSourceAutoConfigure类(来自Alibaba Druid数据库连接池)和DynamicDataSourceAutoConfiguration类(来自Baomidou Dynamic DataSource,可能用于多数据源配置)都试图定义名为dataSource的Bean。

要解决这个问题,你可以采取以下几种方法之一:

  1. 排除自动配置
    你可以在@SpringBootApplication注解所在的类上,使用@SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class, DynamicDataSourceAutoConfiguration.class})来排除这两个自动配置类。然后,你可以手动配置你所需的数据源。

  2. 手动配置数据源: 你也可以选择不使用自动配置,而是手动定义你的数据源配置。这样,你可以更精确地控制数据源的创建和管理。在你的配置类中使用@Bean注解来创建和配置DataSource。(最终用这种方式解决了问题)。使用@Configuration注解标记配置类,并使用@Bean注解创建数据源实例。这里以HikariCP为例,它是一个高性能的JDBC连接池:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.beans.factory.annotation.Value;
    import com.zaxxer.hikari.HikariDataSource;
    
    import javax.sql.DataSource;
    
    @Configuration
    public class DataSourceConfig {
    
        @Value("${spring.datasource.url}")
        private String dbUrl;
    
        @Value("${spring.datasource.username}")
        private String dbUsername;
    
        @Value("${spring.datasource.password}")
        private String dbPassword;
    
        @Value("${spring.datasource.driver-class-name}")
        private String dbDriverClassName;
    
        @Bean
        public DataSource dataSource() {
            HikariDataSource dataSource = new HikariDataSource();
            dataSource.setJdbcUrl(dbUrl);
            dataSource.setUsername(dbUsername);
            dataSource.setPassword(dbPassword);
            dataSource.setDriverClassName(dbDriverClassName);
            // 设置其他HikariCP特有的配置...
            return dataSource;
        }
    }

    application.propertiesapplication.yml文件中,设置数据库连接的相关属性:

    # application.properties spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  3. 指定Bean名称
    如果你确实需要两个数据源(例如,一个主数据源和一个从数据源),你可以确保这两个自动配置的数据源有不同的名称,然后在你的应用中通过名称来引用它们。这通常需要在你的application.propertiesapplication.yml中指定数据源的别名,或者在Java配置中自定义数据源Bean的名称。

  4. 使用@ConditionalOnMissingBean
    如果可能的话,你可以修改自动配置类,使用@ConditionalOnMissingBean注解来确保只有在没有同名的Bean时才创建该Bean。但是,由于这两个类都是第三方库提供的,你可能没有权限修改它们。

  5. 调整Spring Boot版本或依赖版本
    有时,这种冲突可能是由不同版本的库之间的不兼容引起的。确保你使用的所有Spring Boot相关依赖都是兼容的,并尝试升级或降级相关库的版本,以查看是否可以解决冲突。

  6. 查看文档和社区
    查看Alibaba Druid和Baomidou Dynamic DataSource的官方文档,看看是否有关于如何在同一个项目中使用它们的指南或建议。此外,也可以搜索相关的社区和论坛,看看其他人是如何解决类似问题的。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

因上精进,果上随缘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值