Hi, for english only.

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

Liang Zhang (John)
Apache ShardingSphere & Dubbo


许开卫 <[email protected]> 于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
> 邮箱/[email protected]
> 地址/北辰世纪中心A座10层
>
> ------------------------------------------------------------------------------------------------
>
>
>
> [image: cid:[email protected]]
>
>
>

Reply via email to