SpringBoot动态数据源

动态数据源(dynamic dataSource)

目的

在web开发中经常会遇到一个应用需要连接多个数据源的情况, 可以将数据源理解为数据的服务器, 而应用作为获取数据的客户端就需要和多个数据服务器之间建立连接。
多数据源的连接颇像web服务器的连接。
本文基于springboot+ Mybatis + druid的环境,分析如何建立多数据源。

方法

添加动态数据源的方法 可以之间参考下面的两篇文章。
Spring Boot + Mybatis多数据源和动态数据源配置 - CSDN博客
druid/druid-spring-boot-starter at master · alibaba/druid · GitHub

原理:

考虑连接WEB服务器一般需要的技术方法:

  • 确定服务器的Ip和端口号
  • 因为http请求的无记忆性,所以引入了cookie和session技术记住用户
  • 为了性能,使用http连接池。

相同的方式:在数据库连接时, 我们也需要相同的处理。 为了有个明显的对比,使用表格的方式列出

http请求 数据连接池
服务器的Ip和端口号 定义数据源DataSource
session SqlSession
http连接池 DruidDataSource(阿里的数据库连接池)

从上表可以看出Http请求和数据库连接池DataSource之间是非常相似的,只是两者连接时, 使用的协议不同。
从本质上讲: 协议也只不过是客户端和服务端之间的报文格式和交互通信方式的描述。

理清了数据库连接需要的信息, 下面只需要将上述三个点连接起来即可,
下面,我们通过代码看下springboot中如何将上述三点连接起来:

  1. 创建相应的数据源
 @Bean(name = "ds2")
    @ConfigurationProperties(prefix = "spring.datasource.db2") // application.properteis中对应属性的前缀
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }
  1. 创建相应的sqlSession
    通过mybatis-spring – MyBatis-Spring | 第五章 使用 SqlSession 中可以知道,mybatsi-spring其实是通过SqlSessionTemplate 来管理SqlSession
    , SqlSessionFactory 来创建SqlSession. 所以想要使用SqlSession. 只需要提供SqlSessionTemplate 即可。spring会利用该对象进行session的创建和销毁

通过查看下SqlSessionTemplate的类,以及利用spring生成Bean的方式,很容易生成特定DataSource的SqlSessionTemplate。

 @Bean
    public SqlSessionFactory sqlSessionFactory1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(ds1); // 使用titan数据源, 连接titan库

        return factoryBean.getObject();

    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1()); // 使用上面配置的Factory
        return template;
    }
  1. 链接

现在对于spring来说, 只是生成了一个DataSource和DataSource像对应的Session管理器。 而在真正调用mybatis层方法的时候,并不知道该mapper层是想要访问哪一个数据源。

而链接方式即是加上如下的配置:

@MapperScan(basePackages = {"titan.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory1")
public class MybatisDbLogisticsServiceConfig {}

打开MapperScan的源码,可以看到下面的注释:

* @MapperScan("org.mybatis.spring.sample.mapper")
 * public class AppConfig {
 *
 *   @Bean
 *   public DataSource dataSource() {
 *     return new EmbeddedDatabaseBuilder()
 *              .addScript("schema.sql")
 *              .build();
 *   }
 *
 *   @Bean
 *   public DataSourceTransactionManager transactionManager() {
 *     return new DataSourceTransactionManager(dataSource());
 *   }
 *
 *   @Bean
 *   public SqlSessionFactory sqlSessionFactory() throws Exception {
 *     SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
 *     sessionFactory.setDataSource(dataSource());
 *     return sessionFactory.getObject();
 *   }

很容易的看出, 其用于将某一文件夹下的Mapper文件和特定的DataSource, DataSourceTransactionManager(事务管理器), SqlSessionFactory 相关联。

关联之后, 执行某一Mapper类时, 就可以知道访问哪一个具体的DataSource了。

  1. 连接池
    关于连接池的配置, 可以使用
 @Bean(name = "ds2")
    @ConfigurationProperties(prefix = "spring.datasource.db2") // application.properteis中对应属性的前缀
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }

并加上下面的配置:

spring.datasource.db2.type=com.alibaba.druid.pool.DruidDataSource

或者在声明数据源时直接使用DruidDataSourceBuilder的数据源构造器。

@Primary
@Bean
@ConfigurationProperties("spring.datasource.druid.one")
public DataSource dataSourceOne(){
    return DruidDataSourceBuilder.create().build();
}

调试方式

在写完所有所需要的部分, 下面就需要检验多数据源是否生效。
最简单的检验方式就是将程序跑起来, 分别调用不同数据源的方法, 观察数据源的切换。
下面介绍下两种调试方法:

  1. debug模式启动程序,并在调用mapper的方法内打断点。并查看Mapper的相关属性是否正确。这在检查数据源的属性(比如闲时检测)是否设置到数据源中至关重要。


    f5c45e3d.png
  2. 另外一种, 可以连接mysql,并查看数据库的连接情况。
    主要是使用下面的命令:

show processlist;

显示结果如下:


image.png

上面显示了该数据库的连接情况。 从中可以看出以下几点信息:
1: 有那些主机连接到该数据库 即Host列,
2: 每个连接的状态,即Command
3: 连接保持的时间 即 Time

复盘

  • 多debug
  • 多思考与联系

参考文献

mybatis – MyBatis 3 | 简介
mybatis-spring – MyBatis-Spring | 第六章 注入映射器
Spring Boot + Mybatis多数据源和动态数据源配置 - CSDN博客
druid/druid-spring-boot-starter at master · alibaba/druid · GitHub

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,748评论 6 342
  • 网上的文章基本上都是只有多数据源或只有动态数据源,而最近的项目需要同时使用两种方式,记录一下配置方法供大家参考。 ...
    邵云涛阅读 1,017评论 0 9
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,429评论 0 4
  • 原文载:歪头看乡愁-不热闹 在鞭炮声隆隆的大年初一写文,难以不提及乡愁。少小离家,说的应该就是现在的我们——为学业...
    见深不知深阅读 206评论 0 0