注解实现 读写数据库分离

整体思想:需要注解-需要aop注解切换数据库标识-需要spring根据标识切换数据库

  1. 注解 – 数据库标识
    • read:切换读
    • write:切换写
  2. 数据库context持有类–DataSourceContextHolder–持有当前线程数据库标识 dbType
    • ThreadLocal dbType 属性
    • 还有3个方法–切换dbType 为"read",切换dbType 为"write",获取 dbType
  3. aop类–DataSourceAop-2种方法,分别对应读写数据库–注意@Order,最小(最优先),需要在@Transactional 前面
    • setRead:指向Read注解
      • 切换数据库context持有类 数据标识为 read
    • setWrite:指向write注解
      • 切换数据库context持有类 数据标识为 write
  4. spring数据库路由–DataSourceProxy extends AbstractRoutingDataSource
    • 重写determinCurrentLookupKey方法:该方法根据 返回的标识自动判断调用哪个数据库
      • return DataSourceContextHolder . getDataBaseType(),spring在执行数据库操作的时候会先调用这个方法,根据返回的信息(“read”/“write”)与读写数据库配置进行对比,切换到对应数据库实例。
  5. dataSource注入 数据源–向DataSourceProxy 设置 默认数据源 和 切换数据源
  • 读写数据源config–数据源单例实例,根据@Read/@Write 选择某个数据源单例 创建connection
    • 配置读写数据源bean–根据配置文件生成读写数据库连接池实例:read-write
    • 对应读写方法 返回bean实例–DataSourceBuilder .create .type(xx dataSourceType).build(),该方法会将对应bean单例注入到 数据源中,供 AbstractRoutingDataSource 判断使用
  1. mybatisConfig-- 将数据源设置到 SqlSessionFactory中

猜你喜欢

转载自blog.csdn.net/weixin_40401730/article/details/89357738