当前位置: 首页 > news >正文

网站后缀 .cgi百度人工服务热线24小时

网站后缀 .cgi,百度人工服务热线24小时,优秀的个人网站,女孩子读电子商务好就业吗背景 在项目开发过程中,我们可能会遇到一个场景:某个类型数据源有多个数据源实例,需要我们按照不同的请求切换到不同数据源去。 而目前绝大多数java应用都是基于Spring框架来开发,我们很多时候相关的数据源连接都是交给了Spring框…

背景

在项目开发过程中,我们可能会遇到一个场景:某个类型数据源有多个数据源实例,需要我们按照不同的请求切换到不同数据源去。
而目前绝大多数java应用都是基于Spring框架来开发,我们很多时候相关的数据源连接都是交给了Spring框架去管理,这就需要Spring能够支持动态数据源切换。

方案

Spring中预留了这个接口,通过AbstractRoutingDataSource能够动态切换数据源。

public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean {

这是一个抽象类,预留了一个抽象方法:

protected abstract Object determineCurrentLookupKey();

我们知道,数据源一般都会提供一个getConnection方法来获取一个连接,在AbstractRoutingDataSource 实现如下:

	@Overridepublic Connection getConnection() throws SQLException {return determineTargetDataSource().getConnection();}protected DataSource determineTargetDataSource() {Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");Object 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;}

可以看到,AbstractRoutingDataSource 获取连接的主要逻辑就是通过determineCurrentLookupKey获取到一个数据源的关联key,然后从resolvedDataSources中去获取。
resolvedDataSources的初始化,则放在afterPropertiesSet中:

	@Overridepublic void afterPropertiesSet() {if (this.targetDataSources == null) {throw new IllegalArgumentException("Property 'targetDataSources' is required");}this.resolvedDataSources = CollectionUtils.newHashMap(this.targetDataSources.size());this.targetDataSources.forEach((key, value) -> {Object lookupKey = resolveSpecifiedLookupKey(key);DataSource dataSource = resolveSpecifiedDataSource(value);this.resolvedDataSources.put(lookupKey, dataSource);});if (this.defaultTargetDataSource != null) {this.resolvedDefaultDataSource = resolveSpecifiedDataSource(this.defaultTargetDataSource);}}

这里起始就是通过targetDataSources中指定的数据源复制到resolvedDataSources 中去。因此如果多数源是固定的,那么只需要实现determineCurrentLookupKey方法即可。但是如果多数据源不固定,比如可能会有数据源的变更,那么这种实现是不能够支持,因为这种实现从服务启动的视乎,后续数据源就不能发生变更,这需要我们自己实现determineTargetDataSource.
下面是一个参考实现:

public class DataSourceContextHolder {private static final ThreadLocal<String> DATASOURCE_CONTEXT_KEY_HOLDER = new ThreadLocal<>();public static void switchDataSource(String key){log.info("Switch to data source:" + key);DATASOURCE_CONTEXT_KEY_HOLDER.set(key);}public static String getDataSourceKey(){return DATASOURCE_CONTEXT_KEY_HOLDER.get() ;}}public class DynamicDataSource extends AbstractRoutingDataSource {private Map<Object, Object> targetDataSources = new HashMap<>();private Map<Object, DataSource> dataSources = new HashMap<>();public DynamicDataSource (){super.setDefaultTargetDataSource(null);super.setTargetDataSources(targetDataSources);super.afterPropertiesSet();}@Overrideprotected DataSource determineTargetDataSource() {Object dataSourceKey = determineCurrentLookupKey();return dataSources.get(dataSourceKey);}@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder .getDataSourceKey();}public synchronized void addDataSource(String key, DataSource dataSource){targetDataSources.put(key,dataSource);dataSources.put(key,dataSource);log.info("add tenant dynamic dataSource for tenantId = {} ",key);}
}

这样我们通过DataSourceContextHolder 来调整当前线程关联的数据源。

http://www.ritt.cn/news/5886.html

相关文章:

  • 网站建设方案书1500字国外免费建站网站
  • 学校门户网站建设方案网站优化基本技巧
  • 手机版网站开发框架免费的网站申请
  • 茂名一站式网站建设报价seo免费优化工具
  • 租个网站服务器多少钱广州抖音seo公司
  • wordpress 章节 插件500强企业seo服务商
  • 有网站怎么做appseo关键词优化培训
  • 长沙小学网站建设郴州网站建设
  • 南昌网站建设服务真实有效网络优化师
  • 黄埔网站建设优化seo青岛招聘seo
  • 湘潭做网站郑州seo优化阿亮
  • 徐州飞虹网架公司杭州优化关键词
  • 网站外包后百度降权南京百度快照优化排名
  • 咸阳做网站托管百度优化服务
  • 简述电子商务网站的内容设计与开发免费seo网站的工具
  • b2c网站策划一键优化大师
  • 郑州网站建设注意事项seo搜索引擎优化人才
  • 少女のトゲ在线观看seo优化总结
  • 什么叫网站收录提交东莞seo计费
  • 中国建设银行网站E路护航官网黄页引流推广网站入口
  • 手机网站js特效太原seo推广外包
  • 拼多多客服外包平台关键词优化推广公司
  • 网站建设中国的发展买卖友链
  • 个人简历网站模板下载外贸营销型网站制作公司
  • 做动画网站公司市场调研报告500字
  • 河南城乡建设厅网站推广信息哪个平台好
  • 大学网站建设定制网站建设网络营销实践总结报告
  • 余姚做网站哪家好实体店营销方案
  • 做执法设备有哪些网站百度营销推广登录平台
  • 做网站和做网页有啥区别百度站长工具抓取诊断