`
ymm8505
  • 浏览: 32927 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring实现动态数据源切换 包教包会

    博客分类:
  • Java
阅读更多
项目背景:
现在随着软件项目的越来越大、靠一个集中式的项目已经无法满足并发量。 如果说数据量特别大就需要进行分库。这是最基本的策略,比如按照省份分库、某几个省分为一个域。一个域对应一个物理数据库。
分域如下:
一域:北京、上海
二域:河南、宁夏
三域:山西、吉林
四域:广东、四川

===========================================================================
那我们项目中启一套程序怎么实现这种数据源的动态切换呢?

假设项目中已经实现了动态数据源切换?那我们总的有一个依据、省份编码就是一个很好的字段。根据请求中带来的:省份编码、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环境。
分享到:
评论

相关推荐

    Spring动态切换多数据源Demo

    "Spring动态切换多数据源Demo"是一个示例项目,它展示了如何在Spring中实现灵活的数据源切换。 首先,我们需要了解Spring中的数据源。在Spring中,数据源(DataSource)是Java中定义的javax.sql.DataSource接口的...

    Springboot 动态多数据源 jta分布式事务

    本资源针对的是Spring Boot动态多数据源和JTA(Java Transaction API)分布式事务的实现,对于初学者来说非常实用。下面我们将深入探讨这些知识点。 首先,让我们了解一下Spring Boot的多数据源。在许多业务场景下...

    spring mybaitis 多数据源 多数据库连接资料及源代码.zip

    3. "SpringBoot之MyBatis多数据源配置实现 - 上善若水 - CSDN博客.html":可能介绍Spring Boot中基于Mybatis的多数据源配置步骤,包括配置文件的编写、数据源切换策略等。 4. "SpringBoot+Mybatis多数据源配置 - ...

    SSM多数据源分包

    要实现多数据源的切换,我们需要一个数据源路由类(`AbstractRoutingDataSource`)。这个类可以根据某种策略(如请求上下文、注解、线程本地变量等)动态选择使用哪个数据源。在初始化时,需要将所有可能的数据源...

    SSM框架多数据源的配置

    2. 数据源切换:在运行时,确保根据业务需求正确切换数据源,避免出现数据不一致的问题。 3. 测试验证:完成配置后,务必进行详尽的单元测试和集成测试,确保多数据源功能正常工作。 总结,SSM框架的多数据源配置...

    Springboot+mybatis多数据源整合 抽象基础类

    使用ThreadLocal可以实现线程级别的数据源切换,因为每个线程都有自己的ThreadLocal变量存储空间,这样就可以确保数据源的选择不会受到其他线程的影响。 具体实现时,我们可以创建一个`AbstractBaseMapper`类,它...

    spring-jdbc-RoutingDataSource

    在Spring JDBC模块中,RoutingDataSource是一个动态数据源,它可以根据一定的规则(比如基于数据库连接池的名字、运行时环境等)来决定使用哪个具体的数据源。这种方式允许我们在应用程序中灵活地切换或组合不同的...

    twodatasource.rar

    此外,还可能包含测试用例,以验证配置是否正确,以及数据源切换功能是否正常工作。 总之,"twodatasource.rar"提供了关于Spring配置双数据源的实践教程,对于理解和实现这一高级技术非常有帮助。通过对这两个数据...

    springboot-demo.rar

    通过这个“springboot-demo.rar”中的示例,我们可以学习到如何在 SpringBoot 项目中集成 Druid 数据源,使用 MyBatis 进行数据操作,以及如何配置多数据源和实现动态数据源切换。这是一个很好的实践教程,对于理解 ...

    Spring Boot 系列教程 JDBC

    在Spring Boot项目中,可以通过application.properties或application.yml文件来配置数据源。包括数据库驱动类、URL、用户名和密码等信息。例如: ``` spring.datasource.url=jdbc:mysql://localhost:3306/test ...

    spring.net+Nhibernate 学习资料与源码

    这种整合通常涉及以下步骤:配置Spring.NET容器,定义数据源,设置NHibernate SessionFactory,创建DAO(数据访问对象)接口和实现,以及配置事务策略。 在《Spring.NET_NHibernate_Cn_Book》这个压缩包中,你可能...

    SSH(Struts1+Spring+Hibernate)配置开发总结

    - 配置数据库连接参数,若未预先建立数据源,则需通过MyEclipse DB Browser来创建。 - 完成配置后,可能需要处理重复的包文件,此时选择替换重复的文件即可。 #### 三、环境测试示例——注册功能实现 1. **打开...

    spring security 参考手册中文版

    第七部分 Spring数据集成 273 38. Spring Data&Spring安全配置 273 39. @Query中的安全表达式 273 第八部分 附录 274 40.安全数据库模式 274 40.1用户模式 274 40.1.1集团当局 274 40.2持久登录(记得我)架构 275 ...

    Spring boot集成Mybatis的方法教程

    如果需要实现多数据源,可以使用Spring的`@Profile`注解和`@Primary`注解来动态选择数据源。在配置类中定义不同的数据源,并在需要的地方切换。 7. **全局异常处理**: 可以创建一个全局的异常处理器,如`...

    aop实战.rar

    3. **动态切换数据源**:在多数据源环境下,AOP可以用于动态地选择合适的数据源进行操作,比如根据事务的性质或者请求来源来切换,以实现数据隔离或者优化性能。 4. **Spring线程安全**:文档可能会讨论Spring中的...

    springboot学习资料+源码

    3. **自动配置:** SpringBoot根据项目类路径中的jar包来自动配置Bean,例如,如果发现项目中存在JDBC驱动,就会自动配置数据源;如果发现MongoDB的驱动,就会自动配置MongoDB的数据访问。 4. **健康检查与Actuator...

    基于SSM+Vue的课程在线教育资源管理系统(1)+数据库(Java毕业设计,包括源码,教程).zip

    在这个项目中,Vue.js用于构建用户界面,实现动态数据绑定和组件化开发,提供更流畅的用户体验。 5. **数据库设计**:系统必定包含一个数据库来存储课程、用户、资源等信息。可能使用MySQL或Oracle等关系型数据库,...

    SpringBoot多模块项目设计与实现demo

    5. 配置数据源和数据库访问,如使用Spring Data JPA或MyBatis。 6. 实现Web接口,使用@RestController和@RequestMapping等注解。 7. 配置单元测试,确保每个模块的功能正确。 8. 打包并部署项目,可以使用Maven的`...

Global site tag (gtag.js) - Google Analytics