问题描述:
public TableRuleConfiguration getTaskPointTableRuleConfiguration() {
TableRuleConfiguration result = new TableRuleConfiguration("t_task_point","ds_master_slave.t_task_point_${0..9}");
StandardShardingStrategyConfiguration standardStrategy = new StandardShardingStrategyConfiguration("user_id",new TaskPointShardingTableAlgorithm());
result.setTableShardingStrategyConfig(standardStrategy);
return result;
}
public TableRuleConfiguration getIncentiveTaskIndexUserTableRuleConfiguration() {
TableRuleConfiguration result = new TableRuleConfiguration("t_incentive_task_index_user","ds_master_slave.t_incentive_task_index_user_${0..9}");
StandardShardingStrategyConfiguration configuration = new StandardShardingStrategyConfiguration("task_id", new IncentiveTaskIndexUserShardingTableAlgorithm());
result.setTableShardingStrategyConfig(configuration);
return result;
}
t_task_point 和 t_incentive_task_index_user 表分了10个表
业务处理完之后需要对 t_incentive_task_index_user 进行批量更新 数据量较大 不能通过for循环一条条更新
尝试过mybatisplus的update<Wrappers.lamdaWrapper>去做,但是他只会更新第一条数据,解释是这只算一个请求,后来处理方法如下:
// An highlighted block
Map<Integer, List<IncentiveTaskIndexUser>> integerListMap = settledTaskUsers.stream().collect(Collectors.groupingBy(IncentiveTaskIndexUser::getTaskId));
for(Integer taskId : integerListMap.keySet()){
List<IncentiveTaskIndexUser> taskUser = integerListMap.get(taskId);
incentiveTaskIndexUserDao.batchUpdate(taskUser);
}
//通过taskid去分组处理,因为是根据taskid分表的,所以每组数据所在的表是一致的
//xml配置 这个地方一定注意不仅仅要带id taskid一定要带上,他才可以通过分片键查找到对应的表
<update id="batchUpdate">
<foreach collection="indexUsers" item="indexUser" separator=";">
update t_incentive_task_index_user set is_settled=#{indexUser.isSettled} where id=#{indexUser.id} and task_id=#{indexUser.taskId}
</foreach>
</update>
//更新 出现更大问题 本地测试完全没问题 上测试环境一直提示t_incentive_task_index_user 表不存在 也就是说 这个分片键没起作用 但是完全一致的版本 按道理不应该出现这个问题
试了很久也没找到问题 暂时解决方法还是切换为 使用for循环 updatebyid一条条循环更新
还有提前计算表名 然后通过$传递表名过去也是可以做到的 ,之所以没有这么做是因为感觉已经用sharding分表了 还要自己做表名的处理 好像不是很合理