Sharding-jdbc

57 篇文章 1 订阅
1 篇文章 0 订阅

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值