Sharding-JDBC使用问题记录

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

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

进入官网:https://shardingsphere.apache.org/index_zh.html
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、策略类)。
以下为不分库只分表的部分配置

  
    
    
    
        
            
            
                
                
            
            
            
                
            
        
        
        
        	true
        
    

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后的第一个表会区分大小写,如果跟逻辑表不一样,查询时不会走全路由,而是直接把该表当真实表查

你可能感兴趣的:(笔记本推荐)