首页 > 其他分享 >shardingJdbc分表执行批量update不支持的解决方式

shardingJdbc分表执行批量update不支持的解决方式

时间:2024-09-12 09:52:33浏览次数:12  
标签:expressStatus update xxxxx item 分表 shardingJdbc createTime expressNo

引言

本次场景,公司通过shardingjdbc 对mysql数据库进行分表,模糊匹配 按照createTime,每季度一张表的方式,精确匹配按照creatTime的方式。关于模糊匹配、精确匹配,自行在shardingjdbc官网查看,分表策略等。
由于是跟进createTime字段去作为分表的key,那么在执行 select、update、delete操作时,需要携带creatTime 字段。

案例

在执行过程中,导入的操作,基于easyexcel 我采用分批次的方式,批量去进行update操作,于是我的sql如下:

    <update id="batchUpdateTmsStatus">
        <foreach collection="tmsFollowBOList" item="item" separator=";">
            update bp_tms_logistics set expressStatus = #{item.expressStatus},userChange = 1,followStatus = #{item.status}
            where createTime = #{item.createTime,jdbcType=DATE}
            and expressNo = #{item.expressNo}
        </foreach>
    </update>

但是问题来了,通过日志发现,执行的sql脚本如下:

update xxxxx_2024_2
set expressStatus = ?,userChange = 1,followStatus = ?
where expressNo = ?
and  createTime = ?;
				 
update xxxxx
set expressStatus = ?,userChange = 1,followStatus = ?
where expressNo = ?
and  createTime = BETWEEN


::: [3, 2, SF2223211, 2024-09-10, 2, 1, SF05050505, 2024-09-09]

细心的可以发现,一个是xxxxx_2024_2 一个是xxxxx ,其实 xxxxx对于我们来说它只是虚拟表,并不存在,我们需要的是xxxxx_2024_2 的形式,而shardingjdbc 并没有 通过代理的方式,代理到正确的数据库表中,查看官网issues 发现,并不支持批量update的方式,也就是我上面的语句。
issues:https://github.com/apache/shardingsphere/issues/6665

解决

由于并不支持批量的操作,刚开始的想法是想直接for循环链接数据库得了,但是我觉得这样并不符合自己的方式,于是,想了想,或许采用 case - when 的方式是否可以实现呢,于是我修改sql如下:


    <update id="batchUpdateTmsStatus">
        update xxxxx
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="expressStatus=case" suffix="end,">
                <foreach collection="tmsFollowBOList" item="item" index="index">
                    <if test="item.expressStatus != null">
                        when expressNo = #{item.expressNo} AND createTime = #{item.createTime,jdbcType=DATE} THEN #{item.expressStatus}
                    </if>
                </foreach>
            </trim>
            <trim prefix="userChange=case" suffix="end,">
                <foreach collection="tmsFollowBOList" item="item" index="index">
                    <if test="item.expressStatus != null">
                        when expressNo = #{item.expressNo} AND createTime = #{item.createTime,jdbcType=DATE} THEN 1
                    </if>
                </foreach>
            </trim>
            <trim prefix="followStatus=case" suffix="end,">
                <foreach collection="tmsFollowBOList" item="item" index="index">
                    <if test="item.status != null">
                        when expressNo = #{item.expressNo} AND createTime = #{item.createTime,jdbcType=DATE} THEN #{item.status}
                    </if>
                </foreach>
            </trim>
        </trim>
    </update>

里面的内容我就不解释了,采用这个方式可以解决批量update 的方式,其中 when 中的条件需要符合哈。

标签:expressStatus,update,xxxxx,item,分表,shardingJdbc,createTime,expressNo
From: https://www.cnblogs.com/zgf123/p/18409594

相关文章

  • BUG: pymysql executemany不支持insert on duplicate key update
    pymysql的executemany()方法支持传入单个SQL和一个sequenceofrecords(sequenceormapping)来同时写入多条数据。例如:sql="insertintot(c1,c2)values(%s,%s)"args=[(1,2),(3,4)]cursor.executemany(sql,args)#Ifargsisalistortuple,%scanbeusedas......
  • MySQL分库分表
    一、概念分库:指将数据按照一定的规则拆分到多个数据库中,每个数据库存储一部分数据。通过分库可以提升数据库的存储能力和扩展性。分表:指将一张大表按照一定的规则拆分成多个小表,每个小表存储原表的一部分数据。通过分表可以提升查询性能,因为每个小表的数据量较少,查询速度......
  • select...for update 到底是加了行锁,还是表锁?
    原文:select...forupdate到底是加了行锁,还是表锁?前言select...forupdate在MySQL中,是一种悲观锁的用法,一般情况下,会锁住一行数据,但如果没有使用正确的话,也会把整张表锁住。1.要什么要用行锁?假如现在有这样一种业务场景:用户A给你转账了2000元,用户B给你转账了3000......
  • MySQL数据库insert,delete,update,select语句
    MySQL数据库insert,delete,update,select语句是在做数据处理是的重要部分首先我们要先拥有一个表格,这里我建立了一个student表然后在这个表格中添加一些数据这里要使用insert的语句INSERTINTOstudent(NO,NAME,age)VALUES(1001,'张三',20);这里我创建到的表有三个属性......
  • 再有人问你什么是分库分表,直接把这篇文章发给他
    目录标题分库、分表、分库分表什么时候分库?什么时候分表?什么时候既分库又分表?横向拆分和纵向拆分分表字段的选择买家还是卖家?卖家查询怎么办?按照订单查询怎么办?分表算法直接取模Hash取模一致性Hash全局ID的生成UUID基于某个单表做自增主键基于多个单表+步长做自增主键......
  • Eclipse Check For Updates总是检查不到更新-解决方法
    最近想用流行的JavaIDE——Eclipse的Help->CheckForUpdates更新Eclipse,结果总是说未找到更新:1.检查是否有更新首先,访问Eclipse下载地址获得最新版本(目前为2020-06):再看看系统中的Eclipse版本(Help->AboutEclipseIDE):如果网上版本和当前版本相等(像图中),那就System.......
  • INSERT ... ON DUPLICATE KEY UPDATE 问题记录
    起因:需要新增复制数据并更新原数据状态,故采用INSERT...ONDUPLICATEKEYUPDATE的方式来插入和更新数据问题:数据插入及更新异常环境:MySQL5.7.32数据表结构:点击查看代码CREATETABLE`example_table`(`col_a`varchar(255)NOTNULL,`col_b`varchar(255)NOTN......
  • 微信小程序 - 云开发报错 errCode: -1 | errMsg: query.update is only available in
    前言关于此问题网上的教程都无法解决,如果您的报错信息与我相似,即可解决。在微信小程序开发中,云开发使用云函数update操作数据库时出现报错:thirdScriptErrorerrCode:-1|errMsg:query.updateisonlyavailableinserverSDK/API;at“pages/x”pagelifeCycleMe......
  • GreatSQL执行Update失败案例分析
    GreatSQL执行Update失败案例分析一问题概述业务反馈在应用核心库的用户基本信息表执行部分update命令失败,报错如下:updatexxx.xxx_staffbasicinfosetstaffidstatus='04’wherestaffidin(select*fromduyuanyu.tmp_d_xiaoyuan)>1265Datatruncatedforcolumn......
  • 【Oracle点滴积累】Oracle 19c安装Critical Patch Update for January 2024
    广告位招租!知识无价,人有情,无偿分享知识,希望本条信息对你有用!今天和大家分享如何为Oracle19c(未启用RMAN的单实例)安装CriticalPatchUpdate(PatchNumber:35943157),本指引不包含RollBack部分,本文仅供参考,谢谢!cd/home/oracle/NewVersion_Opatch/OPatch/./opatchversio......