Spring中的DataSource

  • DataSource的种类
    • 简单的DataSource实现
    • 拥有连接缓冲池的DataSource实现
    • 支持分布式事务的DataSource
    • 自定义DataSource
  • 多数据源
    • 主权独立的数据源
    • 合作连横的多数据源
    • 小结


DataSource的种类

DataSource的基本角色是ConnectionFactory,所有的数据库连接将通过DataSource接口统一管理。

DataSource实现类根据功能强弱可以划分为以下三类:


简单的DataSource实现

org.springframework.jdbc.datasource.DriverManagerDataSource.

顾名思义,DriverManagerDataSource的提出,主要是为了替换最古老的基于java.sql.DriverManager获取连接的方式。

        Class.forName("com.mysql.jdbc.Driver");DriverManager.getConnection("jdbc:mysql://110.40.155.17:3306/test?userSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8","root","126433");

  • DriverManagerDataSource的类结构继承图如下
  • 通过IOC容器使用该DriverManagerDataSource的方法如下:
@Configuration
@Data
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceConfig {private String url;private String username;private String password;private String driverClassName;@Beanpublic DriverManagerDataSource driverManagerDataSource(){DriverManagerDataSource source = new DriverManagerDataSource();source.setUrl(url);source.setDriverClassName(driverClassName);source.setPassword(password);source.setUsername(username);return source;}
}

org.springframework.jdbc.datasource.SingleConnectionDataSource

  • 通过IOC容器使用该singleConnectionDataSource的方法如下:
    @Beanpublic SingleConnectionDataSource singleConnectionDataSource(){SingleConnectionDataSource source = new SingleConnectionDataSource();source.setUrl(url);source.setDriverClassName(driverClassName);source.setPassword(password);source.setUsername(username);//可以设置是否开启自动提交---默认为truesource.setAutoCommit(true);//close方法调用,也不会关闭连接source.setSuppressClose(false);return source;}

拥有连接缓冲池的DataSource实现


常见的数据库连接池有cp30,driud等,这需要引入额外的依赖,这里不多进行演示。

对于这类DataSource,还需要额外指定连接池大小等参数。


支持分布式事务的DataSource


自定义DataSource








Spring提供了DelegatingDataSource的几个实现类



多数据源


主权独立的数据源

所谓主权独立是指系统中的每个数据源都对外独立承担公开数据库资源的职能:



该种数据源在spring中的简单使用如下:

public class Main {public static void main(String[] args) {DataSource mainDataSource = getMainDataSource();JdbcTemplate main=new JdbcTemplate(mainDataSource);DataSource otherDataSource = getOtherDataSource();JdbcTemplate other = new JdbcTemplate(otherDataSource);}private static javax.sql.DataSource getMainDataSource() {BasicDataSource basicDataSource = new BasicDataSource();YamlUtil yamlUtil = new YamlUtil("application.yml");basicDataSource.setDriverClassName(yamlUtil.get("spring.datasource.driver-class-name"));basicDataSource.setUrl(yamlUtil.get("spring.datasource.url"));basicDataSource.setUsername(yamlUtil.get("spring.datasource.username"));basicDataSource.setPassword(yamlUtil.get("spring.datasource.password"));return basicDataSource;}private static javax.sql.DataSource getOtherDataSource() {//如何获取看具体的业务需求...return basicDataSource;}
}

只需要不同的JdbcTemplate拥有不同的DataSource即可。


合作连横的多数据源



AbstractRoutingDataSource原理:

  • getConnection方法会调用determineTargetDataSource来动态获得一个数据库连接
 @Overridepublic Connection getConnection() throws SQLException {return determineTargetDataSource().getConnection();}
  • determineTargetDataSource根据determineCurrentLookupKey返回值决定从dataSource集合中选择哪一个DataSource
 protected DataSource determineTargetDataSource() {Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");//determineCurrentLookupKey抽象方法,负责返回指定的key,然后去集合中动态获取到目标的dataSourceObject lookupKey = determineCurrentLookupKey();DataSource dataSource = this.resolvedDataSources.get(lookupKey);if (dataSource == null && (this.lenientFallback || lookupKey == null)) {dataSource = this.resolvedDefaultDataSource;}if (dataSource == null) {throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");}return dataSource;}
  • 存储dataSource的map集合
 @Nullableprivate Map<Object, Object> targetDataSources;

这里演示一下使用AbstractRoutingDataSource实现多数据源的管控:

@Data
public class DynamicDataSource extends AbstractRoutingDataSource {private String datasource;@Overrideprotected Object determineCurrentLookupKey() {return datasource;}
}
public class DataSourceTestHandler {/*** 获得helper数据库的数据源*/public static DataSource getHelperDataSource(){HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl("xxx");dataSource.setUsername("xxx");dataSource.setPassword("xxx");return dataSource;}/*** 获得training数据库的数据源*/public static DataSource getTrainingDataSource(){HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl("xxx");dataSource.setUsername("xxx");dataSource.setPassword("xxx");return dataSource;}public static DataSource getManagerDataSource(){DynamicDataSource dynamicDataSource = new DynamicDataSource();Map<Object,Object> sources=new HashMap<>();sources.put("helper",getHelperDataSource());sources.put("training",getTrainingDataSource());dynamicDataSource.setTargetDataSources(sources);return dynamicDataSource;}
}

动态切换测试:

    /*** 多数据源结果测试*/@ResponseBody@GetMapping("/{dataSource}/{tableName}")public AjaxResponse testMultiplyDataSource(@PathVariable(name = "dataSource") String dataSource,@PathVariable(name = "tableName")String tableName) throws SQLException {log.info("需要进行测试的数据源为: {}",dataSource);return testService.testMultiplyDataSource(dataSource,tableName);}
@Service
public class TestServiceImp implements TestService {@Overridepublic AjaxResponse testMultiplyDataSource(String dataSource,String tableName) throws SQLException {DynamicDataSource managerDataSource = (DynamicDataSource)getManagerDataSource();managerDataSource.setDatasource(dataSource);managerDataSource.afterPropertiesSet();JdbcTemplate jdbcTemplate = new JdbcTemplate(managerDataSource);List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from " + tableName);return AjaxResponse.success(list);}
}




小结

合纵连横和主权独立可以联合使用:

  • 合纵连横争取主权独立

可以用于存在多个数据源的场景,并且每个数据源存在多个实例,需要进行负载均衡

  • 主权独立并入合纵连横


Spring中的DataSource相关推荐

  1. Spring中配置DataSource数据源的几种选择

    Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...

  2. 常见设计模式实现、详解及在Spring中的应用

    Spring中涉及到的设计模式详解 一.单例模式 1.介绍 要点: 某个类只能有一个实例: 它必须自行创建这个实例: 它必须自行向整个系统提供这个实例. 实现: 单例模式的类只提供私有的构造函数(这样 ...

  3. 【设计模式】Spring 中经典的 9 种设计模式

    前言 控制反转(IoC)和依赖注入(DI) IoC(Inversion of Control,控制翻转) 是Spring 中一个非常非常重要的概念,它不是什么技术,而是一种解耦的设计思想.它的主要目的 ...

  4. Spring中使用Spark连接的DataSource

    在Spring中配置Spark hive-thriftserver的连接DataSource与配置其他数据源连接方式是一样的,如一般Oracle数据源配置,使用如下必须的Jar包: 使用JDBC程序示 ...

  5. 【sping揭秘】19、关于spring中jdbctemplate中的DataSource怎么来呢

    我们这是可以正好借助之前学的factorybean类,自己吧jdbctemplate加载到spring容器中,我们可以封装多个这种对象,那么可以实现针对不同的数据库的jdbctemplate 首先我们 ...

  6. 详解设计模式在Spring中的应用

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,螃蟹在IT学习者网站就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了 ...

  7. 9种设计模式在Spring中的运用,一定要非常熟练!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:iCoding91 https://blog.csdn.ne ...

  8. Spring中的JDBC操作

    一.Spring模板JdbcTemplate 为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架JdbcTemplate. 作 ...

  9. 这些Spring中的设计模式,你都知道吗?

    来自: itxxz.com/a/javashili/tuozhan/2014/0601/7.html 设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆 ...

  10. spring整合mybatis(入门级简单教程1)--在spring中配置c3p0,并成功测试

    引子:spring整合mybatis.因为,我们看完(我就是这样的)spring和mybatis之后,本想自己写一个小小的项目,以便加深理解,但是我发现在spring中整合mybatis并不是一件容易 ...

最新文章

  1. 和12岁小同志搞创客开发:手撕代码,做一款声控灯
  2. LaTex 更改文字颜色
  3. 【数据竞赛】时间序列竞赛炸榜技巧
  4. 【Linux】一步一步学Linux——declare命令(217)
  5. 数组到指针的隐式转换
  6. android设置高德的3d,高德地图3D版的使用方法
  7. 【数据库学习】——从零学习SQL语句(含SQL数据类型、SQL语句实例操作)
  8. 大地坐标系是不是经纬度_批量导入经纬度点到奥维地图中
  9. arcgis10之地理配准
  10. 【问底】许鹏:使用Spark+Cassandra打造高性能数据分析平台(一)
  11. 黑客游戏Hacknet下载(游戏分享一)
  12. 技能高考计算机专业考什么,2016年技能高考计算机专业考试总结
  13. Justinmind,为移动设计而生
  14. [转载]如何提高.NET Compact Framework应用程序的性能 - 黎波 - 博客园
  15. Python 智能项目:1~5
  16. H 指数 (citations[index] > h 才能符合条件)
  17. 小试debian-7.11.0-amd64+Plone5.1.2全文检索和预览中文WORD中文PDF
  18. 基于Appfuse的Web应用快速开发
  19. 3种方法删除7-Zip压缩包的密码
  20. mysql 数据库 ui查询_mysql数据库查询语句

热门文章

  1. 沈向洋:为何读论文这么难?
  2. python 百度cpc点击
  3. CSAPP第七章家庭作业参考答案
  4. 读书印记 - 《人类的群星闪耀时》
  5. C#山寨版本【天翼拨号客户端】---内含详细抓包,模拟数据---万事俱备,只欠东风。
  6. Problem J. Jumbled Compass---Urozero Autumn Training Camp 2016-Day 1||签到模拟时针转动
  7. linux系统下配置无线网卡的方法,linux系统下配置无线网卡的具体步骤
  8. <<算法竞赛进阶指南>>:陪审团
  9. 上云十年:阿里云的奇幻漂流
  10. 你的网名OUT了吗?盘点那些曾经超in的网名