问题一:

我配置了一个分表的策略:

配置文件如下:

<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表里的。

是因为我的配置有问题吗?

 


Reply via email to