一般一个项目就只会用到一个数据库,但是有时候遇到比较复杂的一点的项目就会涉及到多个数据库,比如在业务量较大的时候会涉及到分库分表,如果不增加数据库代理层的话,就只有在项目中来处理。还有像我们现在在一个项目中会涉及到GBase
、MySQL
、DB2
这三种数据库,这种情况就涉及到多种数据库连接。那么我们Spring Boot中如何实现多数据库连接呢?
至于单数据库连接,可以参考我之前记录的日记Spring Boot整合Mybatis Plus和Druid,这里我们就来直接开始多数据库连接的实战。
添加依赖包
1 2 3 4 5
| <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.0.0</version> </dependency>
|
Spring Boot多数据源连接PostgreSQL和MySQL配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| spring: datasource: druid: stat-view-servlet: enabled: true login-username: admin login-password: admin dynamic: primary: mariadb datasource: mariadb: username: root password: root url: jdbc:mysql://127.0.0.1:3306/nacos_config?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true driver-class-name: org.mariadb.jdbc.Driver druid: initial-size: 50 max-active: 200 min-idle: 50 max-wait: 50 pgsql: username: postgres password: postgres url: jdbc:postgresql://xxx.xx.xx.xxx:5432/databasename driver-class-name: org.postgresql.Driver druid: initial-size: 50 max-active: 200 min-idle: 50 max-wait: 50
|
使用dynamic-datasource
新建实体类
我这里用到了两个实体类User
和Feedback
,User
类就不做展示,上一篇有,这里就直接看看我们的Feddback
,
1 2 3 4 5 6 7 8 9 10
| @Data @TableName("wechat_feedback") public class Feedback { private int id; private String title; private String content;
@TableField("open_id") private String openId; }
|
新建Mapper接口类
UserMapper
:
1 2 3
| public interface UserMapper extends BaseMapper<User>{ }
|
FeedbackMapper
:
1 2
| public interface FeedbackMapper extends BaseMapper<Feedback> { }
|
在controller中调用Mapper
这里我们还是用之前编写的UserController
类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| @RequestMapping("/v1/user") @RestController @Api(tags = "User API展示") public class UserController {
@Autowired UserMapper userMapper;
@Autowired FeedbackMapper feedbackMapper;
@ApiOperation(value = "mariadb", notes = "获取mariadb中的用户数据") @GetMapping("/list") @DS("mariadb") public ResponseResult<?> getUserList() { return ResponseResult.success(userMapper.selectList(null)); }
@ApiOperation(value = "pgsql", notes = "获取pgsql中的用户反馈数据") @GetMapping("/feedbacks") @DS("pgsql") public ResponseResult<?> getJobs() { return ResponseResult.success(feedbackMapper.selectList(null)); } }
|
这里需要使用@DS
注解来标识要使用的数据源,该注解可以使用在Class
和METHOD
上,如果是使用在类上,则表示该类都使用这个指定的数据库连接。
1 2 3 4 5 6 7 8 9 10 11 12
| @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DS {
/** * groupName or specific database name or spring SPEL name. * * @return the database you want to switch */ String value(); }
|
由于我这里使用到了Druid
,那么还需要在启动类上加上@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
,排除掉druid-spring-boot-starter
中的DruidDataSourceAutoConfigure
自动配置类。
现在我们启动起来看看效果,可以再启动日志中看到
1 2 3 4
| 2020-02-03 12:54:42.740 INFO com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:1010) 2CNU7X5OLAUE004 --- [ main] c.a.d.p.DruidDataSource : {dataSource-1,mariadb} inited 2020-02-03 12:54:46.592 INFO com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:1010) 2CNU7X5OLAUE004 --- [ main] c.a.d.p.DruidDataSource : {dataSource-2,pgsql} inited 2020-02-03 12:54:46.594 INFO com.baomidou.dynamic.datasource.DynamicRoutingDataSource.addDataSource(DynamicRoutingDataSource.java:148) 2CNU7X5OLAUE004 --- [ main] c.b.d.d.DynamicRoutingDataSource : dynamic-datasource - load a datasource named [mariadb] success 2020-02-03 12:54:46.594 INFO com.baomidou.dynamic.datasource.DynamicRoutingDataSource.addDataSource(DynamicRoutingDataSource.java:148) 2CNU7X5OLAUE004 --- [ main] c.b.d.d.DynamicRoutingDataSource : dynamic-datasource - load a datasource named [pgsql] success
|
现在来访问http://localhost:8080/druid/datasource.html
,可以看到两个数据源