问题一:
我配置了一个分表的策略:
配置文件如下:
<bean id="preciseModuloTableShardingAlgorithm"
class="com.jd.bdp.cv.common.PreciseModuloShardingTableAlgorithm" />
<bean id="rangeModuloShardingTableAlgorithm"
class="com.jd.bdp.cv.common.RangeModuloShardingTableAlgorithm" />
<sharding:standard-strategy id="tableShardingStrategy"
sharding-column="task_id"
precise-algorithm-ref="preciseModuloTableShardingAlgorithm"
range-algorithm-ref="rangeModuloShardingTableAlgorithm"/>
<sharding:data-source id="shardingDataSource">
<sharding:sharding-rule data-source-names="cv_dataSource">
<sharding:table-rules>
<sharding:table-rule logic-table="cv_user_task"
actual-data-nodes="cv_dataSource.cv_user_task_${0..1}"
table-strategy-ref="tableShardingStrategy" />
</sharding:table-rules>
<!-- <sharding:binding-table-rules>
<sharding:binding-table-rule logic-tables="t_order,t_order_item"/>
</sharding:binding-table-rules>
<sharding:broadcast-table-rules>
<sharding:broadcast-table-rule table="t_address"/>
</sharding:broadcast-table-rules>-->
</sharding:sharding-rule>
<sharding:props>
<prop key="sql.show">true</prop>
</sharding:props>
</sharding:data-source>
我的分表逻辑是这么写的:
if (shardingValue.getValue()<7800){
return "cv_user_task_0";
}
else {
Long modValue = shardingValue.getValue() % tableNames.size();
String modStr = modValue.toString();
for (String each : tableNames) {
if (each.endsWith(modStr)) {
return each;
}
}
}
throw new IllegalArgumentException();
具体逻辑是这样的:为了兼容老数据,当shardingValue的值小于某个值(比如1230)的时候,查询之前的表,当大于某个值走分表逻辑。分表逻辑是按照取模运算进行路由的。但是我发现这一段逻辑并没有生效,具体有两个问题:
1. debug的时候只有第一次会进入doSharding方法,之后断点就不进了。
2. 我数据库里面的分表字段都小于1230 所以按照逻辑应该取原来的表cv_user_task,但是从控制台看仍然走 cv_user_task_0
,cv_user_task_1
并且查询不到数据。所以我怀疑是如果表没有在
actual-data-nodes="cv_dataSource.cv_user_task_${0..1}"里面定义,
是查询不到数据的。后面我经过测试得到我的怀疑是正确的,把历史数据放到cv_user_task_0 和cv_user_task_1 这两个表里面
是可以查询到的。但是我历史数据怎么处理呢?(必须要数据迁移吗)
问题二:
我使用sharding 之后,sql里面的 now() 这个函数就不支持了(使用的是mybatis)
报错:
Data truncation: Incorrect datetime value: 'now()' for column 'created'
at row 1
是因为数据库驱动的原因吗?
问题三:
为了测试我的分表逻辑是这么写的:
@Override
public String doSharding(final Collection<String> tableNames, final
PreciseShardingValue<Long> shardingValue) {
return "cv_user_task_0";
}
我将返回值都配置成了cv_user_task_0
但是从控制台发现
既有cv_user_task_0 又有 cv_user_task_1 完全不生效啊。查询出来的数据也是cv_user_task_1表里的。
是因为我的配置有问题吗?
许开卫
京东零售JDR 基础数据平台-智能标注研发部
------------------------------------------------------------------------------------------------
手机/+86 13264002751
邮箱/[email protected]<mailto:[email protected]>
地址/北辰世纪中心A座10层
------------------------------------------------------------------------------------------------
[cid:[email protected]]