首页 > 其他分享 >mybatis 动态数据源核心--AbstractRoutingDataSource

mybatis 动态数据源核心--AbstractRoutingDataSource

时间:2023-06-29 11:57:21浏览次数:52  
标签:return targetDataSources -- 数据源 Object AbstractRoutingDataSource DataSource publ

  1 public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean {
  2     @Nullable
  3     private Map<Object, Object> targetDataSources;
  4     @Nullable
  5     private Object defaultTargetDataSource;
  6     private boolean lenientFallback = true;
  7     private DataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
  8     @Nullable
  9     private Map<Object, DataSource> resolvedDataSources;
 10     @Nullable
 11     private DataSource resolvedDefaultDataSource;
 12 
 13     public AbstractRoutingDataSource() {
 14     }
 15 
 16     //设置当前所支持的数据源列表 是key-datasource列表形式哦  通过切换key就切换了数据源
 17     public void setTargetDataSources(Map<Object, Object> targetDataSources) {
 18         this.targetDataSources = targetDataSources;
 19     }
 20 
 21     //设置默认的数据源
 22     public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
 23         this.defaultTargetDataSource = defaultTargetDataSource;
 24     }
 25 
 26     public void setLenientFallback(boolean lenientFallback) {
 27         this.lenientFallback = lenientFallback;
 28     }
 29 
 30     public void setDataSourceLookup(@Nullable DataSourceLookup dataSourceLookup) {
 31         this.dataSourceLookup = (DataSourceLookup)(dataSourceLookup != null ? dataSourceLookup : new JndiDataSourceLookup());
 32     }
 33     
 34     public void afterPropertiesSet() {
 35         if (this.targetDataSources == null) {
 36             throw new IllegalArgumentException("Property 'targetDataSources' is required");
 37         } else {
 38             this.resolvedDataSources = CollectionUtils.newHashMap(this.targetDataSources.size());
39 this.targetDataSources.forEach((key, value) -> {//解析datasource 40 Object lookupKey = this.resolveSpecifiedLookupKey(key); 41 DataSource dataSource = this.resolveSpecifiedDataSource(value); 42 this.resolvedDataSources.put(lookupKey, dataSource); 43 }); 44 if (this.defaultTargetDataSource != null) { 45 this.resolvedDefaultDataSource = this.resolveSpecifiedDataSource(this.defaultTargetDataSource); 46 } 47 48 } 49 } 50 51 protected Object resolveSpecifiedLookupKey(Object lookupKey) { 52 return lookupKey; 53 } 54 55 protected DataSource resolveSpecifiedDataSource(Object dataSource) throws IllegalArgumentException {
//datasource 可以是DataSource实现类 也可以是string参数 56 if (dataSource instanceof DataSource) { 57 return (DataSource)dataSource; 58 } else if (dataSource instanceof String) { 59 return this.dataSourceLookup.getDataSource((String)dataSource); 60 } else { 61 throw new IllegalArgumentException("Illegal data source value - only [javax.sql.DataSource] and String supported: " + dataSource); 62 } 63 } 64 65 public Map<Object, DataSource> getResolvedDataSources() { 66 Assert.state(this.resolvedDataSources != null, "DataSources not resolved yet - call afterPropertiesSet"); 67 return Collections.unmodifiableMap(this.resolvedDataSources); 68 } 69 70 @Nullable 71 public DataSource getResolvedDefaultDataSource() { 72 return this.resolvedDefaultDataSource; 73 } 74 75 public Connection getConnection() throws SQLException { 76 return this.determineTargetDataSource().getConnection(); 77 } 78 79 public Connection getConnection(String username, String password) throws SQLException { 80 return this.determineTargetDataSource().getConnection(username, password); 81 } 82 83 public <T> T unwrap(Class<T> iface) throws SQLException { 84 return iface.isInstance(this) ? this : this.determineTargetDataSource().unwrap(iface); 85 } 86 87 public boolean isWrapperFor(Class<?> iface) throws SQLException { 88 return iface.isInstance(this) || this.determineTargetDataSource().isWrapperFor(iface); 89 } 90 91 protected DataSource determineTargetDataSource() { 92 Assert.notNull(this.resolvedDataSources, "DataSource router not initialized"); 93 //动态获取当前数据源 key , determineCurrentLookupKey 是关键,我们可以自己实现的切换逻辑 94 Object lookupKey = this.determineCurrentLookupKey(); 95 DataSource dataSource = (DataSource)this.resolvedDataSources.get(lookupKey); 96 if (dataSource == null && (this.lenientFallback || lookupKey == null)) { 97 dataSource = this.resolvedDefaultDataSource; 98 } 99 100 if (dataSource == null) { 101 throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]"); 102 } else { 103 return dataSource; 104 } 105 } 106 107 //这是抽象方法,需要自己实现哦 108 @Nullable 109 protected abstract Object determineCurrentLookupKey(); 110 }

 

标签:return,targetDataSources,--,数据源,Object,AbstractRoutingDataSource,DataSource,publ
From: https://www.cnblogs.com/dint/p/17513844.html

相关文章

  • Session,JWT使用总结
    01.Session:优点:Session是存储在服务端的,安全缺点:服务器集群环境下无法直接使用Session移动端APP(Android、IOS)中无法使用Cookie用户可以自己禁用CookieCookie不能跨域02.令牌技术:JWT令牌JSONWebToken(官网:https://jwt.io/)1.定义了一种简洁的、自包含的格式,用于在通信......
  • 不更改composer源文件的情况下重写compsoer类
    在工作中有时候会遇到原来用的composer包已经不能完全满足需求了,需要重新加入一些功能,这个时候我们可以通过重写composer包类来实现。1.排除的compsoer类,以下为例:"exclude-from-classmap":["vendor/vectorface/googleauthenticator/src/GoogleAuthenticator.php"......
  • springboot入门教程,大家都是怎么学习的?
    ​学习SpringBoot可以帮助你提高Java后端开发的效率和质量,更快速地构建应用程序,并与当前的开发趋势保持一致。不过,建议你始终关注最新的版本和技术发展,及时了解并学习最新的特性和最佳实践。​Springboot对于初学者来说是非常好学的。B站上动力节点王妈妈的springboot3教程......
  • 【C语言】时间结构体
    本文主要就C语言中常用类型time_t具体分析。一、定义首先来看一下定义,原来是一种类型重命名。/*File:/usr/include/time.h*/typedef__time_ttime_t;库文件中使用的其实是__time_t这个命名。/*File:/usr/include/bits/time.h*/structtimeval{__time_ttv_se......
  • 论文故事-motivation
    有一个好的motivation,讲好一个故事,一篇论文就成功了一半,所以以此来记录一些论文的动机,以免弄混了。(有错误,请指出,谢谢)1.AMeta-LearningApproachforCustomModelTraining(2019)motivation:1.在目标任务设置是小类别-小样本时,元学习的方法比迁移学习的方法更好???2.在多类别多样......
  • windows nginx 开机启动
    1、首先下载winsw下载地址:https://github.com/kohsuke/winsw/releaseswinse.NET4.exe或百度云盘:链接:https://pan.baidu.com/s/1-G1dyl1y_WA5ziGV07AHpQ提取码:j8fy或:https://files.cnblogs.com/files/Fooo/nginx%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8.rar?t=1688009381&d......
  • package-lock.json锁定镜像地址404的处理方法
    前言最近接触了一个新的vue项目,安装依赖是一直无法安装成功,有部分依赖包的地址报404,查看package-lock.json,发现其中部分依赖使用了公司私有的镜像库,但是目前该镜像库已关闭,访问该包地址返回404.解决方案如下1、删除package-lock.json,重新npmi生成新的package-lock.json2、先卸......
  • 宏观经济学原理
    GDP的概念在某一既定时期一个国家内生产的所有最终物品与服务的市场价值。GDP=消费+投资+政府购买+净出口净出口外国对国内生产的物品的支出(出口)减国内对外国物品的支出(进口)GDP增多生产了更多的物品与服务以更高的价格销售物品与服务名义、真实GDP名义GDP:按现期价格评......
  • redis之管道(事物)
    redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline是原子性操作。使用管道也就是相当于开启了事物,要么都执行成功,要么都执行失败importred......
  • iview的table里面套Input
    {title:'误差下限',key:'yLowerLimitError',align:'center',minWidth:100,render:(h,params)=>{......