关于Sharding-jdbc

jdbc真是个大坑,如果不是必要进行分库分表的话,就不要使用 sharding-jdbc,因为会有诸多的限制和不方便

版本:2.0.0.M3 

注意:本篇主要针对spring-mybatis不分库只分表

目前Sharding-JDBC还在不断更新中,网上很多资料和答疑都是以前出现但是已修复了的,包括本篇,因此学习资料和问题解答最好是围绕着官方走。推荐加入官方群(在官网里找,提问的人多,答复的人少),可在github上面的issues上看到项目提问动态。

进入官网:http://shardingjdbc.io/ 
github源码:https://github.com/shardingjdbc/sharding-jdbc 
官方demo:https://github.com/shardingjdbc/sharding-jdbc-example 
demo下载下来,里面有很多个示例项目,其中sharding-jdbc-spring-namespace-example为spring-mybatis示例,里面有分库分表、只分表…等不同样例。 
sharding-jdbc是如何把多条sql查询归并为一个结果的呢,参考源码解析-结果归并:http://www.iocoder.cn/Sharding-JDBC/result-merger/#3-1- 
分片配置和读写分离源码解析:http://lalahei.iteye.com/category/363701

整合只需添加三个地方(pom.xml、application.xml、策略类)。 
以下为不分库只分表的部分配置

  <sharding:standard-strategy id="orderTableShardingStrategy" sharding-column="order_id" precise-algorithm-class="io.shardingjdbc.example.spring.namespace.mybatis.algorithm.PreciseModuloTableShardingAlgorithm"/>
    <sharding:standard-strategy id="orderItemTableShardingStrategy" sharding-column="order_id" precise-algorithm-class="io.shardingjdbc.example.spring.namespace.mybatis.algorithm.PreciseModuloTableShardingAlgorithm"/>

    <sharding:data-source id="shardingDataSource">
        <sharding:sharding-rule data-source-names="demo_ds">
            <sharding:table-rules>
            <!-- actual-data-nodes为真实表配置,多个真实表可用逗号分开。generate-key-column为sharding的自增策略键,不用的话就删除 -->
                <sharding:table-rule logic-table="t_order" actual-data-nodes="demo_ds.t_order_${0..2}" table-strategy-ref="orderTableShardingStrategy" generate-key-column="order_id" />
                <sharding:table-rule logic-table="t_order_item" actual-data-nodes="demo_ds.t_order_item_${0..2}" table-strategy-ref="orderItemTableShardingStrategy" generate-key-column="order_item_id" />
            </sharding:table-rules>
            <sharding:binding-table-rules>
            <!-- 配置绑定表(分片规则相同,一般为主表子表的关系),若不是绑定表不用配置,否则全路由不会走笛卡尔积 -->
                <sharding:binding-table-rule logic-tables="t_order, t_order_item"/>
            </sharding:binding-table-rules>
        </sharding:sharding-rule>
        <sharding:props>
        <!-- 打印sharding执行的sql语句,可查看逻辑表和真实表执行情况;还需配置pom.xml并添加logback.xml -->
            <prop key="sql.show">true</prop>
        </sharding:props>
    </sharding:data-source>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Sharding-JDBC 2.0.0.M3版本只分表不分库使用记录:

  1. 用数据库原生id自增,分片失效

  2. 在insert的sql中,若包含有主键字段,则sharding-jdbc的主键自增会失效

  3. 若使用sharding-jdbc自带自增策略,因生成偶数几率很大,所以适合分表数为奇数,如t_order_0,t_order_1,t_order_2

  4. 分表后需要保证各表的主键不重复,可在程序内生成主键插入

  5. 分片键的选择(需结合表结构和业务考虑): 
    主键 
    根据用户ID进行分配、 
    根据某一个外键的值进行分配、 
    根据时间进行分配

  6. 历史数据的处理 
    分表后,需按照分表规则对原有数据进行迁移,没迁移或者数据迁移到了错误的数据表,都会导致无法查到这些数据

  7. SQL语句限制(将已有项目加入sharding进行分表最难的就是修改以前的SQL语句)

    有限支持子查询

    不支持包含冗余括号的SQL

    不支持HAVING

    不支持OR,UNION 和 UNION ALL

    不支持特殊INSERT

    每条INSERT语句只能插入一条数据,不支持VALUES后有多行数据的语句

    不支持DISTINCT聚合

    不支持dual虚拟表

    不支持SELECT LAST_INSERT_ID()

    不支持CASE WHEN

    举例: 
    (1) sql中出现’where order_id=1 OR order_id=2’,运行时会报sharding的异常No support ‘OR’ 
    (2) 关于冗余括号,如’…join … on a.id=b.id AND(1=1) where …’,这个AND(1=1)若放在where后面不会异常,但放在join on 后面就会出现以下异常: 
    io.shardingjdbc.core.parsing.parser.exception.SQLParsingException: SQL syntax error, expected token is ‘EQ’, actual token is ‘INT’, literals is ‘1’.

  8. 对sql的部分限制是全局的(如OR、CASE WHEN、冗余sql,部分子查询等),对于不分表的,要添加另外一个数据源。参考官方FAQ第八条:http://shardingjdbc.io/docs_cn/01-start/faq/。我按这里的方法一没试成功,用的方法二。

  9. 分表的逻辑表名区分大小写(后续版本会更正) 
    测得的是sql语句中紧跟着from后的第一个表会区分大小写,如果跟逻辑表不一样,查询时不会走全路由,而是直接把该表当真实表查

猜你喜欢

转载自blog.csdn.net/yangstarss/article/details/80177605