栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

记录一次java.sql.SQLException: Column count doesn‘t match value count 排查的经过

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记录一次java.sql.SQLException: Column count doesn‘t match value count 排查的经过

记录一次java.sql.SQLException: Column count doesn’t match value count 排查的经过

数据库是Oceanbase
框架是Mybaties
插入的sql 由于公司代码需要保密,不方便截图,这里是伪代码
insert user(name,age,sex,personno)values(‘张三’,16,‘男’,410522200506303214);
id是自增主键 ,所以插入的列里没有id字段,分了10个库10表
{000-090:10}

分库分表规则是
toint(substr(personno,-3,2)) 取身份证号的倒数第二位和第三位作为分库分表位

排查开始:
第一步,看到这个错误,明显是插入的列和值的数量不匹配,但是仔细看了好几遍,确实是匹配的,很神奇
第二步:拿着报错的sql去dms执行了一遍,可以插入,这就很神奇了,sql没问题,但是代码去执行就报错
java.sql.SQLException: Column count doesn’t match value count
第三步:网上搜了一下别人遇到的这个坑,但是都和我的不一样。
第四部:
看下Oceanbase的路由日志:
发现这条sql居然路由到了010这个库里,这就奇怪了,根据路由规则
SELECt substr(personno,-3,2) from user
获得的是21,应该路由到020的库里才对,很明显,路由出了问题

第五步:求助DBA的帮助,把排查步骤和结果描述了一下,DBA去看了下Oceanbase的路由日志,发现路由规则不是**
toint(substr(personno,-3,2))**
而是:
toint(substr(certno,-3,2))**
因为这个路由规则不是我配置的,我去找了那个配置的同事,结果发现她是最开始配置了**toint(substr(certno,-3,2))***,原因就是从别的表配置里复制粘贴的,然后发现我们这个表没有这个certno字段,后来改成
toint(substr(personno,-3,2))

到这里结果就出来了,**toint(substr(personno,-3,2))***这个配置没有生效,去咨询了DBA,第一次默认生效,以后的变更只有这个库的owner或者DBA才有权限给手动生效,然后让DBA大佬给开了一下,问题解决

但是为什么会报出这个错误呢,我猜想了一下,应该是我们这个表没有certno这个字段,然后还根据这个字段去配置了分库分表规则,所以在Oceanbase编译阶段,发现我们的insert语句里没有这一列,才会报出来列和值数量不匹配的错误,这真的是有点坑,一个问题搞了一天,不过也算是有收获吧

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/276464.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号