• SpringBoot 整合多数据源


    mybatis提供的@MapperScan注解中有一个属性叫做sqlSessionTemplateRef,通过给这个属性提供不同的模板实现,可以在同一个项目中使用多数据源。

    不过这种方式只能以包的粒度划分,最终的效果大概是:对com.XX.A包使用1号数据源,对com.XX.B包使用2号数据源。

    如果需要更精细化的控制,可以考虑使用第三方框架,但不在本文涉及范围内。

    GitHub - baomidou/dynamic-datasource-spring-boot-starter: dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务https://github.com/baomidou/dynamic-datasource-spring-boot-starter

    依赖

    首先引入依赖:

    1. <dependency>
    2. <groupId>mysql</groupId>
    3. <artifactId>mysql-connector-java</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>org.mybatis.spring.boot</groupId>
    7. <artifactId>mybatis-spring-boot-starter</artifactId>
    8. </dependency>

    SpringBoot2.X自带了数据源Hikari,如果是SpringBoot1.X,则需要自己单独引入一下。

    当然,用其他数据源(比如druid)也可以。

    1. <dependency>
    2. <groupId>com.zaxxer</groupId>
    3. <artifactId>HikariCP</artifactId>
    4. <version>3.4.5</version>
    5. </dependency>

    配置文件

    为了更清晰点,就不把数据库配置文件和主配置文件放一起了。

    新建两个properties文件,放在resources目录下,分别存放两个数据源的配置

    wms-mysql.properties

    1. jdbc.wms.driverClassName = com.mysql.jdbc.Driver
    2. jdbc.wms.url = jdbc:mysql://localhost:3306/wms_test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
    3. jdbc.wms.username = root
    4. jdbc.wms.password = root

    wcs-mysql.properties

    1. jdbc.wcs.driverClassName = com.mysql.jdbc.Driver
    2. jdbc.wcs.url = jdbc:mysql://localhost:3306/wcs_test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
    3. jdbc.wcs.username = root
    4. jdbc.wcs.password = root

    配置类

    注意:basePackages配置的包路径,是Dao接口存放的路径,也是当前数据源配置项生效的范围。

    第一个数据源配置类:

    1. @Configuration
    2. @PropertySource("classpath:wms-mysql.properties")
    3. @MapperScan(basePackages = "com.zikoo.datasource.demo.wmsdao", sqlSessionTemplateRef = "wmsSqlSessionTemplate")
    4. public class WmsDataSourceConfig {
    5. @Value("${jdbc.wms.driverClassName}")
    6. private String driverClassName;
    7. @Value("${jdbc.wms.url}")
    8. private String url;
    9. @Value("${jdbc.wms.username}")
    10. private String userName;
    11. @Value("${jdbc.wms.password}")
    12. private String password;
    13. @Primary
    14. @Bean(name = "wmsDataSource")
    15. public DataSource wmsDataSource() {
    16. HikariDataSource hikariDataSource = new HikariDataSource();
    17. hikariDataSource.setDriverClassName(driverClassName);
    18. hikariDataSource.setJdbcUrl(url);
    19. hikariDataSource.setUsername(userName);
    20. hikariDataSource.setPassword(password);
    21. hikariDataSource.setPoolName("wms");
    22. hikariDataSource.setMaxLifetime(290000);
    23. hikariDataSource.setMaximumPoolSize(64);
    24. hikariDataSource.setMinimumIdle(4);
    25. return hikariDataSource;
    26. }
    27. @Primary
    28. @Bean(name = "wmsSqlSessionFactory")
    29. public SqlSessionFactory wmsSqlSessionFactory(@Qualifier("wmsDataSource") DataSource dataSource) throws Exception {
    30. SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
    31. sqlSessionFactory.setDataSource(dataSource);
    32. sqlSessionFactory.setVfs(SpringBootVFS.class);
    33. //配置xml
    34. // sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
    35. // getResources(""));
    36. return sqlSessionFactory.getObject();
    37. }
    38. @Primary
    39. @Bean(name = "wmsTransactionManager")
    40. public DataSourceTransactionManager wmsTransactionManager(@Qualifier("wmsDataSource") DataSource dataSource) {
    41. return new DataSourceTransactionManager(dataSource);
    42. }
    43. @Primary
    44. @Bean(name = "wmsSqlSessionTemplate")
    45. public SqlSessionTemplate wmsSqlSessionTemplate(@Qualifier("wmsSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
    46. return new SqlSessionTemplate(sqlSessionFactory);
    47. }
    48. }

    第二个数据源配置类

    1. @Configuration
    2. @PropertySource("classpath:wcs-mysql.properties")
    3. @MapperScan(basePackages = "com.zikoo.datasource.demo.wcsdao", sqlSessionTemplateRef = "wcsSqlSessionTemplate")
    4. public class WcsDataSourceConfig {
    5. @Value("${jdbc.wcs.driverClassName}")
    6. private String driverClassName;
    7. @Value("${jdbc.wcs.url}")
    8. private String url;
    9. @Value("${jdbc.wcs.username}")
    10. private String userName;
    11. @Value("${jdbc.wcs.password}")
    12. private String password;
    13. @Bean(name = "wcsDataSource")
    14. public DataSource wcsDataSource() {
    15. HikariDataSource hikariDataSource = new HikariDataSource();
    16. hikariDataSource.setDriverClassName(driverClassName);
    17. hikariDataSource.setJdbcUrl(url);
    18. hikariDataSource.setUsername(userName);
    19. hikariDataSource.setPassword(password);
    20. hikariDataSource.setPoolName("wcs");
    21. hikariDataSource.setMaxLifetime(290000);
    22. hikariDataSource.setMaximumPoolSize(64);
    23. hikariDataSource.setMinimumIdle(4);
    24. return hikariDataSource;
    25. }
    26. @Bean("wcsSqlSessionFactory")
    27. public SqlSessionFactory wcsSqlSessionFactory(@Qualifier("wcsDataSource") DataSource dataSource) throws Exception {
    28. SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
    29. sqlSessionFactory.setDataSource(dataSource);
    30. sqlSessionFactory.setVfs(SpringBootVFS.class);
    31. //配置xml
    32. // sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
    33. // getResources(""));
    34. return sqlSessionFactory.getObject();
    35. }
    36. @Bean(name = "wcsTransactionManager")
    37. public DataSourceTransactionManager wcsTransactionManager(@Qualifier("wcsDataSource") DataSource dataSource) {
    38. return new DataSourceTransactionManager(dataSource);
    39. }
    40. @Bean(name = "wcsSqlSessionTemplate")
    41. public SqlSessionTemplate wcsSqlSessionTemplate(@Qualifier("wcsSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
    42. return new SqlSessionTemplate(sqlSessionFactory);
    43. }
    44. }

    目录结构

  • 相关阅读:
    C++模版基础
    Leetcode 805. 数组的均值分割
    MindFusion JS Chart 2.0 Crack
    P6774 [NOI2020] 时代的眼泪(分块)
    目标检测论文解读复现之十四:一种基于残差网络优化的航拍小目标检测算法
    数字化转型系列主题:战略咨询常用术语解释和样例说明
    html静态商城网页制作 基于HTML+CSS+JavaScript在线服装商城店铺商城设计毕业论文源码
    机器学习期中考试
    洛谷 P1349 广义斐波那契数列(矩阵快速幂, 水题)
    《向量数据库指南》——AI原生Milvus Cloud 中NATS 配置项详解
  • 原文地址:https://blog.csdn.net/qq_37855749/article/details/125415097