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、策略类)。
以下为不分库只分表的部分配置



    
        
        
            
            
        
        
        
            
        
    
    
    
        true
    

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版本只分表不分库使用记录:

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

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

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

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

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

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

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’.

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

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

你可能感兴趣的:(Sharding-jdbc,IT,java)