1. 需求

公司的项目才用MyBatis-Plus框架,快速实现了CRUD功能,减少大量的代码。近期在有需求需要操作两个MySQL数据库,有如下方案:

  1. 将另外一个库抽离成一个模块单独进行数据源配置,引入该模块并使用。
  2. 在同一模块中采用不同的数据源进行查询。

综合考虑到简洁轻便性,故而选用方案二。

2. 实现

2.1 数据库连接组件

		<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
        <!-- druid 官方 starter -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.23</version>
        </dependency>
		
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.2</version>
        </dependency>
        <!-- 动态数据源依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.3.2</version>
        </dependency>

2.2 数据库连接相关配置

### 连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=10
spring.datasource.druid.max-active=20
spring.datasource.druid.web-stat-filter.exclusions="*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
spring.datasource.druid.stat-view-servlet.login-username=druid
spring.datasource.druid.stat-view-servlet.login-password=druid
spring.datasource.druid.stat-view-servlet.reset-enable=false
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*

# 动态数据源配置
spring.datasource.dynamic.primary=data-center
spring.datasource.dynamic.strict=false
spring.datasource.dynamic.datasource.product.url=jdbc:mysql://127.0.0.1:3306/product_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.dynamic.product.data-center.username=root
spring.datasource.dynamic.product.data-center.password=123654
spring.datasource.dynamic.product.data-center.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.dynamic.datasource.order.url=jdbc:mysql://127.0.0.1:3306/order_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.dynamic.datasource.order.username=root
spring.datasource.dynamic.datasource.order.password=123654
spring.datasource.dynamic.datasource.order.driver-class-name=com.mysql.cj.jdbc.Driver


# mybatis配置
mybatis.mapper-locations=classpath:/mapper/*/*Mapper.xml

2.3 使用@DS注解切换数据源

@DS 可以注解在方法上或类上,可以在Mapper层或者ServiceImpl层加都是生效的,同时存在就近原则 方法上注解 优先于 类上注解。

注解结果
没有@DS默认数据源
@DS(“dsName”)dsName可以为组名也可以为具体某个库的名称
@Service
@DS("data-center")
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {

}

3. 踩坑

在多数据源改造之前,我的系统是正常运行在原始的单库配置下的。除了以上的改造,并没有做其他修改,启动应用报错如下:

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
	If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
	If you have database settings to be loaded from a particular profile you may need to activate it (the profiles local are currently active).

根据错误可以看出来是没有读取到数据源的url,但是我确实配置了,最终发现默认走的是DruidDataSourceAutoConfigure的自动配置,因此我要禁用它 的自动配置。在应用启动类上排除掉即可:

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class BizExecutorApplication {

	public static void main(String[] args) {
        SpringApplication.run(BizExecutorApplication.class, args);
	}

}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐