sharding分表结合mybatisplus的idworker批量更新的问题

问题描述:

    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分表了 还要自己做表名的处理 好像不是很合理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值