问题一:
我配置了一个分表的策略:
配置文件如下:
<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]]

Reply via email to