You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shardingsphere.apache.org by 许开卫 <xu...@jd.com.INVALID> on 2019/12/04 06:11:32 UTC

Problems in using shardingsphere

问题一:
我配置了一个分表的策略:
配置文件如下:
<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
邮箱/xukaiwei@jd.com<ma...@jd.com>
地址/北辰世纪中心A座10层
------------------------------------------------------------------------------------------------


[cid:image001.png@01D4F06A.1717C3A0]


Re: Problems in using shardingsphere

Posted by "zhangliang@apache.org" <zh...@apache.org>.
Hi, for english only.

------------------

Liang Zhang (John)
Apache ShardingSphere & Dubbo


许开卫 <xu...@jd.com.invalid> 于2019年12月4日周三 下午4:53写道:

> 问题一:
>
> 我配置了一个分表的策略:
>
> 配置文件如下:
>
> <*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
> 邮箱/xukaiwei@jd.com
> 地址/北辰世纪中心A座10层
>
> ------------------------------------------------------------------------------------------------
>
>
>
> [image: cid:image001.png@01D4F06A.1717C3A0]
>
>
>