一般一个项目就只会用到一个数据库,但是有时候遇到比较复杂的一点的项目就会涉及到多个数据库,比如在业务量较大的时候会涉及到分库分表,如果不增加数据库代理层的话,就只有在项目中来处理。还有像我们现在在一个项目中会涉及到GBase、MySQL、DB2这三种数据库,这种情况就涉及到多种数据库连接。那么我们Spring Boot中如何实现多数据库连接呢?
至于单数据库连接,可以参考我之前记录的日记Spring Boot整合Mybatis Plus和Druid,这里我们就来直接开始多数据库连接的实战。
添加依赖包
com.baomidou dynamic-datasource-spring-boot-starter 3.0.0
Spring Boot多数据源连接PostgreSQL和MySQL配置
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,
@Data@TableName("wechat_feedback")public class Feedback { private int id; private String title; private String content; @TableField("open_id") private String openId;}
新建Mapper接口类
UserMapper:
public interface UserMapper extends BaseMapper{}
FeedbackMapper:
public interface FeedbackMapper extends BaseMapper {}
在controller中调用Mapper
这里我们还是用之前编写的UserController类:
@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface DS { /** * groupName or specific database name or spring SPEL name. * * @return the database you want to switch */ String value();}
这里需要使用@DS注解来标识要使用的数据源,该注解可以使用在Class和METHOD上,如果是使用在类上,则表示该类都使用这个指定的数据库连接。
@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @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自动配置类。
现在我们启动起来看看效果,可以在启动日志中看到
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} inited2020-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} inited2020-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] success2020-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,可以看到两个数据源
这篇博文是今年初记录,但是里面的东西不过时,若有不足之处还望指正,多谢。欢迎感兴趣的朋友与我多多交流