正文

sharding-jdbc 是一个优秀的分库分表的工具类。同样的分库分表的数据库中间件有mycat。

sharding-jdbc 接管连接池、分析SQL来达到在程序内的sharding功能;而mycat 更像是一个中间件产品,对程序来讲,是认为mycat就是mysql。

特别需要注意的地方有几个:

配置文件配置的时候,inline的 placeholder 会和 Spring 的placeholder冲突,需要配置 Spring 忽略不可解析 ignore-unresolvable

1
<context:property-placeholder location="classpath:app.properties" ignore-unresolvable="true" />

inline 解析表规则的时候,官方的example中只有最简单的求余,下面我需要的是按日期年月来分表的逻辑。注意,当真是表不存在的事情,在具体sharding的时候会提示表xxx 不存在的错误。需要注意下时间的操作逻辑。解析inline表名可以参考源码。如果不放心,可以写一个测试用例。

1
2
3
4
5
6
7
8
9
10
11
12
13
<sharding:data-source id="shardingDataSource">
<sharding:sharding-rule data-source-names="dataSource">
<sharding:table-rules>
<sharding:table-rule logic-table="fuel_daily"
actual-data-nodes="dataSource.fuel_daily_${2017..2030}${['01','02','03','04','05','06','07','08','09','10','11','12']}"
<!-- 这里会笛卡尔积解析成所有的真实表。 -->
table-strategy-ref="stattimeShardingStrategy"/>
</sharding:table-rules>
<sharding:binding-table-rules>
<sharding:binding-table-rule logic-tables="fuel_daily"/>
</sharding:binding-table-rules>
</sharding:sharding-rule>
</sharding:data-source>

在某些函数支持的不是很好,比如说在sharding的时候做sum,我遇到了返回多个返回值的情况,我想到的解决方法是手动去sum,不用在SQL中做。

在引包的时候,注意如果Spring 的namespace无法找打,清合适下是否Spring的namespace包被引入了。我找了源码最后才确定了包名。

insert into values (“”, “”) 多个时候,会导致不能正确的选择分片执行。所以最好的方式是手动维护Map来决定怎么批量insert。

最后,如果实在不放心的时候,清注意写好测试用例来验证。

希望sharing-jdbc 越来越好。