银河小分队 2022-09-09 10:29 采纳率: 0%
浏览 68

多个数据源配置,两个mybatis配置spring value和Autowired失效

多个数据源配置,环境springboot 2.6,jdk11,Mybatis plus 3.5.1。

有个多数据源的需求,使用原来注解动态切换,但是新同事总是弄错数据库,所以我配置另一个Mybatis plus的环境。一切都很多顺利,但是使用spring Configuration配置,value和Autowired注解失效,请如何解决?

@Configuration
public class MyBatisMapperScanConfigV2 implements  DisposableBean {
    @Value("${x.dataSource.driver-class-name}")
    private String driverClassName;

    @Value("${x.dataSource.url}")
    private String url;

    @Value("${x.dataSource.username}")
    private String username;

    @Value("${x.dataSource.password}")
    private String password;

    @Autowired
    private Environment environment;

    @Bean("d3MapperScannerConfigurer")
    public MapperScannerConfigurer mapperScannerConfigurer() throws Exception {
        HikariDataSource dataSource = this.createDataSource();
        this.dataSource = dataSource;
        SqlSessionFactory standaloneSqlSessionFactory = this.createStandaloneSqlSessionFactory(dataSource);
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("cn.cnic.security.x.dao");
        mapperScannerConfigurer.setSqlSessionFactory(standaloneSqlSessionFactory);

        return mapperScannerConfigurer;
    }

    /**
     * 创建一个独立的SqlSessionFactory,连接池也独立的
     * @return
     */
    public SqlSessionFactory createStandaloneSqlSessionFactory(DataSource dataSource) throws Exception {


        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        // 配置数据源,此处配置为关键配置,如果没有将 dynamicDataSource作为数据源则不能实现切换
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage("cn.cnic.security.x.dao");    // 扫描Model
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            sessionFactory.setMapperLocations(resolver.getResources("classpath*:mapper/x/*Dao.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setMapUnderscoreToCamelCase(true); //开启自动驼峰命名规则
        sessionFactory.setConfiguration(configuration);

        //
        GlobalConfig globalConfig = new GlobalConfig();
        GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
        dbConfig.setIdType(IdType.AUTO);


        globalConfig.setDbConfig(dbConfig);
        sessionFactory.setGlobalConfig(globalConfig);

        return sessionFactory.getObject();
    }

    @Override
    public void destroy() throws Exception {
        if(this.dataSource != null ){
            log.info("isClosed = {},isRunning = {}",this.dataSource.isClosed(),this.dataSource.isRunning());
            this.dataSource.close();
        }
    }


    public HikariDataSource createDataSource(){
        HikariConfig config = new HikariConfig();

        dataSource.setDriverClassName(this.driverClassName);
        dataSource.setJdbcUrl(this.url);
        dataSource.setUsername(this.username);
        dataSource.setPassword(this.password);

        System.out.println("driver-class-name:"+environment.getProperty("x.datasource.driver-class-name"));
        System.out.println("url:"+this.url);
        config.setDriverClassName("com.mysql.cj.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://127.0.0.1/x?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&rewriteBatchedStatements=true");
        config.setUsername("x");
        config.setPassword("x");
        config.setConnectionTestQuery("select 1");
        config.setMinimumIdle(0);
        config.setMaximumPoolSize(5);

        HikariDataSource dataSource = new HikariDataSource(config);
        return dataSource;
    }
}

注意:如果把配置写死到代码时可以运行的。我需要是需要通过配置文件读取jdbc的配置信息,并且根据开发测试环境进行切换,也可以说需要实现:spring.profiles.active。

    2,在运行测试时,spring bean配置完成之后是可以注入的。
  • 写回答

3条回答 默认 最新

  • 银河小分队 2022-12-29 11:08
    关注

    目前通过代码写死线程池的配置,可以正常运行,不用通过注解动态切换数据库。不能读取配置个人感觉应该是Mybatis的ClassPathMapperScanner加载的太早了

    评论

报告相同问题?

问题事件

  • 创建了问题 9月9日

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP