当前位置:   article > 正文

【Java】Springboot整合多数据源配置_java springboot 配置多数据源 mysql 为默认数据源

java springboot 配置多数据源 mysql 为默认数据源

本文目录

一、背景描述

二、多数据源配置

2.1 springboot + druid + mybatis-plus 使用注解整合

2.1.1 主要依赖的包

2.1.2 pom.xml文件配置

2.1.3 application.yml 文件配置

2.1.4 给使用非默认数据源添加注解@DS

2.2 springboot + mybatis 使用分包方式整合

2.2.1 主要依赖包

2.2.2 pom.xml文件配置

2.2.3 application.yml 文件配置

2.2.4 建立连接数据源的配置文件

2.2.5 具体实现图


一、背景描述

本文主要介绍两种整合方式,分别是 springboot + druid + mybatis-plus 使用注解方式整合和 springboot + mybatis 使用分包方式整合。

在本地新建两个数据库,名称分别为 db1db2,新建一张user表,表结构如下:

SQL语句如下:

  1. CREATE TABLE `iot_daily`.`User` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  3. `name` varchar(50) NULL COMMENT '姓名',
  4. `age` int(3) NULL COMMENT '年龄',
  5. `sex` tinyint(1) NOT NULL DEFAULT 0 COMMENT '性别,男0(默认),女1',
  6. PRIMARY KEY (`id`)
  7. );

二、多数据源配置

2.1 springboot + druid + mybatis-plus 使用注解整合

2.1.1 主要依赖的包

  • spring-boot-starter-web
  • mybatis-plus-boot-starter
  • dynamic-datasource-spring-boot-starter # 配置动态数据源
  • druid-spring-boot-starter # 阿里的数据库连接池
  • mysql-connector-java
  • lombok

2.1.2 pom.xml文件配置

pom.xml文件配置如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.9.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.example</groupId>
  12. <artifactId>mutiple.datasource1</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <description>Demo project for Spring Boot</description>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. </properties>
  18. <dependencies>
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.baomidou</groupId>
  25. <artifactId>mybatis-plus-boot-starter</artifactId>
  26. <version>3.2.0</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>com.baomidou</groupId>
  30. <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  31. <version>2.5.6</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>mysql</groupId>
  35. <artifactId>mysql-connector-java</artifactId>
  36. <scope>runtime</scope>
  37. </dependency>
  38. <dependency>
  39. <groupId>com.alibaba</groupId>
  40. <artifactId>druid-spring-boot-starter</artifactId>
  41. <version>1.1.20</version>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.projectlombok</groupId>
  45. <artifactId>lombok</artifactId>
  46. <optional>true</optional>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.springframework.boot</groupId>
  50. <artifactId>spring-boot-starter-test</artifactId>
  51. <scope>test</scope>
  52. </dependency>
  53. </dependencies>
  54. <build>
  55. <plugins>
  56. <plugin>
  57. <groupId>org.springframework.boot</groupId>
  58. <artifactId>spring-boot-maven-plugin</artifactId>
  59. </plugin>
  60. </plugins>
  61. </build>
  62. </project>

2.1.3 application.yml 文件配置

application.yml 配置文件内容如下:

  1. server:
  2. port: 50100
  3. servlet:
  4. context-path: /
  5. spring:
  6. application:
  7. name: back-brain-platform
  8. system: smarthome
  9. cache:
  10. type: generic
  11. datasource:
  12. dynamic:
  13. primary: db2 #设置默认的数据源或者数据源组,默认值即为master
  14. strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源.
  15. datasource:
  16. db1:
  17. url: jdbc:mysql://test.iot.com:3306/iot_db1?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull
  18. username: root
  19. password: 123456
  20. type: com.alibaba.druid.pool.DruidDataSource
  21. driver-class-name: com.mysql.jdbc.Driver
  22. db2:
  23. url: jdbc:mysql://devl.iot.com:3306/iot_db2?autoReconnect=true&characterEncoding=utf-8&rewriteBatchedStatements=true&allowMultiQueries=true
  24. username: root
  25. password: 123456
  26. type: com.alibaba.druid.pool.DruidDataSource
  27. driver-class-name: com.mysql.jdbc.Driver
  28. druid:
  29. # 初始化连接数
  30. initialSize: 10
  31. # 最小连接池数量
  32. minIdle: 20
  33. # 最大连接池数量
  34. maxActive: 100
  35. # 配置连接等待超时的时间,单位为毫秒
  36. maxWait: 60000
  37. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  38. timeBetweenEvictionRunsMillis: 60000
  39. # 配置一个连接在池中最小生存的时间,单位是毫秒
  40. minEvictionIdleTimeMillis: 300000
  41. # 配置一个连接在池中最大生存的时间,单位是毫秒
  42. maxEvictionIdleTimeMillis: 900000
  43. # 配置检测连接是否有效
  44. validationQuery: SELECT 1 FROM DUAL
  45. # testOnBorrow 能够确保我们每次都能获取到可用的连接,但是如果设置为 true,则每次获取连接时候都要到数据库验证连接有效性,这在高并发的时候会造成性能下降,
  46. # 可以将 testOnBorrow 设置成 false,testWhileIdle 设置成 true 这样能获得比较好的性能
  47. testWhileIdle: true
  48. testOnBorrow: false
  49. # testOnBorrow 和 testOnReturn 在生产环境一般是不开启的,主要是性能考虑。
  50. testOnRetrun: false
  51. webStatFilter:
  52. enabled: true
  53. # Druid StatViewServlet配置
  54. stat-view-servlet:
  55. # 默认 true 内置监控页面首页/druid/index.html
  56. enabled: true
  57. url-pattern: /druid/*
  58. # 允许清空统计数据
  59. reset-enable: true
  60. login-username: iot
  61. login-password: iot
  62. # IP 白名单,多个用逗号分隔
  63. allow:
  64. # IP 黑名单
  65. deny:
  66. filter:
  67. stat:
  68. enabled: true
  69. # 慢SQL记录
  70. log-slow-sql: true
  71. slow-sql-millis: 1500
  72. merge-sql: true
  73. wall:
  74. config:
  75. multi-statement-allow: true
  76. autoconfigure:
  77. exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure #去除druid配置

因为Springboot的强大的自动配置,让我们省去了很多功夫,但同时,如果你不需要使用自动配置,那么需要取消加载对应的自动配置类。

而DruidDataSourceAutoConfigure会注入一个DataSourceWrapper,其会在原生的spring.datasource下找 url, username, password 等。动态数据源 URL 等配置是在 dynamic 下,因此需要排除,否则会报错。排除方式有两种,一种是上述配置文件排除,还有一种可以在项目启动类排除:

  1. @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
  2. public class Application {
  3. public static void main(String[] args) {
  4. SpringApplication.run(Application.class, args);
  5. }
  6. }

2.1.4 给使用非默认数据源添加注解@DS

@DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解。
注解在 service 实现或 mapper 接口方法上,不要同时在 service 和 mapper 注解。

  1. @DS("db2")
  2. public interface UserMapper extends BaseMapper<User> {
  3. }
  4. @Service
  5. @DS("db2")
  6. public class ModelServiceImpl extends ServiceImpl<ModelMapper, Model> implements IModelService {
  7. @Select("SELECT * FROM user")
  8. @DS("db2")
  9. List<User> selectAll();
  10. }

2.2 springboot + mybatis 使用分包方式整合

2.2.1 主要依赖包

  • spring-boot-starter-web
  • mybatis-spring-boot-starter
  • mysql-connector-java
  • lombok

2.2.2 pom.xml文件配置

pom.xml文件配置如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.9.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.example</groupId>
  12. <artifactId>mutiple.datasource2</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <description>Demo project for Spring Boot</description>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. </properties>
  18. <dependencies>
  19. <!-- spring 依赖 -->
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <!-- mysql 依赖 -->
  25. <dependency>
  26. <groupId>org.mybatis.spring.boot</groupId>
  27. <artifactId>mybatis-spring-boot-starter</artifactId>
  28. <version>2.1.0</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>mysql</groupId>
  32. <artifactId>mysql-connector-java</artifactId>
  33. <scope>runtime</scope>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.projectlombok</groupId>
  37. <artifactId>lombok</artifactId>
  38. <optional>true</optional>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-starter-test</artifactId>
  43. <scope>test</scope>
  44. </dependency>
  45. </dependencies>
  46. <build>
  47. <plugins>
  48. <plugin>
  49. <groupId>org.springframework.boot</groupId>
  50. <artifactId>spring-boot-maven-plugin</artifactId>
  51. </plugin>
  52. </plugins>
  53. </build>
  54. </project>

2.2.3 application.yml 文件配置

application.yml 配置文件内容如下(和配置差不多,下面只展示不同的地方):

  1. server:
  2. port: 50100 # 启动端口
  3. servlet:
  4. context-path: /
  5. spring:
  6. datasource:
  7. db1: # 数据源1
  8. jdbc-url: jdbc:mysql://test.iot.com:3306/iot_db1?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull
  9. username: root
  10. password: 123456
  11. driver-class-name: com.mysql.cj.jdbc.Driver
  12. db2: # 数据源2
  13. jdbc-url: jdbc:mysql://devl.iot.com:3306/iot_db2?autoReconnect=true&characterEncoding=utf-8&rewriteBatchedStatements=true&allowMultiQueries=true
  14. username: root
  15. password: 123456
  16. driver-class-name: com.mysql.cj.jdbc.Driver
  • 注意事项

    各个版本的 springboot 配置 datasource 时参数有所变化,例如低版本配置数据库 url 时使用 url 属性,高版本使用 jdbc-url 属性,请注意区分。

2.2.4 建立连接数据源的配置文件

第一个配置文件

  1. @Configuration
  2. @MapperScan(basePackages = "com.example.multiple.datasource.mapper.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")
  3. public class DataSourceConfig1 {
  4. @Primary // 表示这个数据源是默认数据源, 这个注解必须要加,因为不加的话spring将分不清楚那个为主数据源(默认数据源)
  5. @Bean("db1DataSource")
  6. @ConfigurationProperties(prefix = "spring.datasource.db1") //读取application.yml中的配置参数映射成为一个对象
  7. public DataSource getDb1DataSource(){
  8. return DataSourceBuilder.create().build();
  9. }
  10. @Primary
  11. @Bean("db1SqlSessionFactory")
  12. public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
  13. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  14. bean.setDataSource(dataSource);
  15. // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)
  16. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/db1/*.xml"));
  17. return bean.getObject();
  18. }
  19. @Primary
  20. @Bean("db1SqlSessionTemplate")
  21. public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
  22. return new SqlSessionTemplate(sqlSessionFactory);
  23. }
  24. }

第二个配置文件

  1. @Configuration
  2. @MapperScan(basePackages = "com.example.multiple.datasource.mapper.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")
  3. public class DataSourceConfig2 {
  4. @Bean("db2DataSource")
  5. @ConfigurationProperties(prefix = "spring.datasource.db2")
  6. public DataSource getDb1DataSource(){
  7. return DataSourceBuilder.create().build();
  8. }
  9. @Bean("db2SqlSessionFactory")
  10. public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
  11. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  12. bean.setDataSource(dataSource);
  13. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/db2/*.xml"));
  14. return bean.getObject();
  15. }
  16. @Bean("db2SqlSessionTemplate")
  17. public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
  18. return new SqlSessionTemplate(sqlSessionFactory);
  19. }
  20. }

2.2.5 具体实现图

  • 注意事项

    在 service 层中根据不同的业务注入不同的 dao 层
    如果是主从复制- -读写分离:比如 db1 中负责增删改,db2 中负责查询。但是需要注意的是负责增删改的数据库必须是主库(master)

完结!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/52373
推荐阅读
相关标签
  

闽ICP备14008679号