项目背景:
现在随着软件项目的越来越大、靠一个集中式的项目已经无法满足并发量。 如果说数据量特别大就需要进行分库。这是最基本的策略,比如按照省份分库、某几个省分为一个域。一个域对应一个物理数据库。
分域如下:
一域:北京、上海
二域:河南、宁夏
三域:山西、吉林
四域:广东、四川
===========================================================================
那我们项目中启一套程序怎么实现这种数据源的动态切换呢?
假设项目中已经实现了动态数据源切换?那我们总的有一个依据、省份编码就是一个很好的字段。根据请求中带来的:省份编码、IP信息、交易流水等都可以作为 切换数据源的依据。
思路上通了以后就看需要怎么样的技术才能实现数据源的切换呢?
org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
里面有一个抽象方法
protected abstract Object determineCurrentLookupKey();
抽象方法就是自己只定义 不实现,让子类实现抽象方法赋值、然后返回到父类中。
//仔细看一下这个抽象方法返回的是个什么东西
protected DataSource determineTargetDataSource()
{
Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
//抽象方法返回的 一个数据源的key 也就是Spring中注入数据源的一个Map集合的key
Object lookupKey = determineCurrentLookupKey();
//根据key得到数据源 配置 Spring中注入数据源的一个Map集合的key 对应的value
DataSource 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返回给谁了////////////////////
AbstractRoutingDataSource 抽象类里面的方法
public Connection getConnection()throws SQLException
{
return determineTargetDataSource().getConnection();
}
public Connection getConnection(String username, String password) throws SQLException {
return determineTargetDataSource().getConnection(username, password);
}
//找到AbstractRoutingDataSource 的父类、父类里面没有这两个方法。
public abstract class AbstractRoutingDataSource extends AbstractDataSource
//父类AbstractDataSource 实现了一个DataSource接口
public abstract class AbstractDataSource implements DataSource{
}
//在DataSource接口里面定义了这两个方法。
public interface DataSource extends CommonDataSource,Wrapper {
Connection getConnection() throws SQLException;
Connection getConnection(String username, String password)
throws SQLException;
}
AbstractRoutingDataSource实现了InitializingBean类,实现了afterPropertiesSet方法.afterPropertiesSet方法在bean的属性赋值之后执行,
并检查targetDataSources 是否有值,如果有值就将targetDataSources 转换成
resolvedDataSources.也就是说,如果你要使用AbstractRoutingDataSource,就必须在方法afterPropertiesSet执行之前,进行targetDataSources 属性的初始化.这也就是目前网上的配置方式,在配置文件里配置N个数据源的由来.
【扩展阅读 afterPropertiesSet 方法什么时候执行】
http://www.iteye.com/topic/1046993
===============================================
所有准备工作作为之后。写一个AOP的拦截到请求,解析请求中的省份编码。实现数据源切换。
整理一下代码。稍后会放到Git上 实现是Spring MVC + Mybatis环境。
分享到:
相关推荐
mybatis+spring实现动态切换数据源,修改数据源配置信息之后,直接运行test可进行测试
通过SpringAop实现多数据源的动态切换 并采用Druid连接池,可扩展继续增加数据库配置。
请自行修改com/resources/datasource.properties中数据库配置,Demo中配置的两个数据源,一个是Mysql,一个是Oracle。 运行之前请自行建立数据库的表。
1. 基于Aspectj实现动态数据源...6. 实现事务内切换数据源(支持原生Spring声明式事务哟,仅此一家),并支持多数据源事务回滚(有了它除了跨服务的事务你需要考虑分布式事务,其他都不需要,极大的减少了系统的复杂程度)
通过简单的demo实现SpingBoot多数据源配置并动态切换多数据源
spring 动态切换数据源
spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制
mybatis+spring实现动态切换数据源,修改数据源配置信息之后,直接运行test可进行测试 maven项目 导入即可 jar包都不用 适合学习参考 出自Java自学网 (Java自学网专供 就是免积分下载)
Spring+SpringMvc+MybatisPlus实现多数据源切换、利用自定义Aop注解,只需要在需要切换数据库的方法上加上注解即可实现、极大避免了代码冗余。
使用注解配置实现Spring动态数据源切换,实现原理 1、自定义动态数据源类DynamicDataSource: 实现spring类AbstractRoutingDataSource的方法determineCurrentLookupKey 2、自定义Spring AOP类DataSourceAspect 3、...
spring mybatis 多数据源动态切换
本篇文章主要介绍了详解Spring(AbstractRoutingDataSource)实现动态数据源切换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
spring boot整合druid连接池,采用注解方式实现多数据源动态切换 jdk版本1.8 spring boot版本1.5.14
个人博文----真正意义的spring动态切换数据源 对应的源码,使用spring+springmvc+mybatis开发
用于详细描述配置spring下多数据源动态切换方案的实施配置说明。可以自动切换数据源的配置。
SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询,案例以postgresql和oracle数据库为数据源,分别使用mybatis-plus分页插件和pagehelper分页插件实现分页查询。
spring动态数据源整合mybatis实现的分库分表操作。 分库分表对业务代码是透明的,只需要在配置文件分配分库模版即可动态的实现分库分表的增删改查操作。
Spring 动态切换 数据源 可同事在多个数据源中切换
Springcloud 多数库 多数据源整合,查询动态切换数据库
SPRING框架中,动态数据源连接的实现。 可以根据用户来选择连接的数据库。