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]] > > >
