zoukankan      html  css  js  c++  java
  • [zebra源码]分组数据源GroupDataSource读写分离

    前面 分组数据源GroupDataSource及其初始化 已经知道 GroupDataSource 在初始化的时候会初始化两个DataSource, 读 readDataSource + 写 writeDataSource

    由于zebra 也是基于 jdbc规范实现的, 所以sql执行的过程和 jdbc api最原始的api一样的

    (1) 从DataSource 获取连接 #getConnection
    (2) Connection 创建语句 #prepareStatement
    (3) 语句的执行 Statement#executeQuery()

    可以顺着上述jdbc api的执行过程查看代码执行逻辑, 发现其中读写分离的核心逻辑位于 GroupConnection#getRealConnection(sql, forceWrite) 中, 根据不同的情况 从 读 readDataSource 还是 writeDataSource 取底层连接

    具体过程:
    image.png

    读写库判断逻辑

    1. routeType 路由类型默认为 masterSlave 读写分离, 可在配置文件修改

    2. forceWrite=true的场景为直接调用 Statement 的更新方法 Statement#executeUpdate 或批量执行场景
      image.png

    3. sql hint 在sql前增加了特殊注释 /+zebra:w/ 则走写库

    4. ReadWriteStrategy 则是一个预定义的java接口, 如果提供了实现类, 则会根据 #shouldReadFromMaster() 来判断强制从写库读数据, 主要用于避免 写主库然后读从库 而从库同步延迟的问题

    ZebraForceMasterHelper#forceMasterInLocalContext() 强制读主库就是基于 ReadWriteStrategy 的实现类 LocalContextReadWriteStrategy 来实现的 (内部用的ThreadLocal存储状态)

    1. 最后,会直接根据 sql 字符串解析是读操作(select) 还是写操作(update/delete/select for update/ddl ..) 来从读ds还是写ds获取连接

    需要debug的话,可以从单元测试入手

    • LocalContextReadWriteStrategyTest
    • CustomizedReadWriteStrategyWrapperTest
    • com.dianping.zebra.group.jdbc.DPGroupPreparedStatementTest#test_read_and_write_perpared_statement

    完整目录:数据库中间件zebra源码分析

    本文来自博客园,作者:mushishi,转载请注明原文链接:https://www.cnblogs.com/mushishi/p/15022069.html

  • 相关阅读:
    markdownPad2 绿色破解版安装
    解决idea 控制台中文乱码
    PS CC 破解安装教程(亲测可用)
    mp4文件格式之fragment mp4
    音视频技术总结
    ffmpeg的内部Video Buffer管理和传送机制
    OMX Codec详细解析
    Gstreamer的一些基本概念与A/V同步分析
    stagefright omx小结
    OMXCodec与OMX事件处理流程
  • 原文地址:https://www.cnblogs.com/mushishi/p/15022069.html
Copyright © 2011-2022 走看看