当前位置: 首页 > 后端技术 > Java

妈的,又是一个在线问题

时间:2023-04-01 22:12:00 Java

这几天在做ShardingSphere,又是一个问题。当我启动它时,我报告了一个NPE。还好这个问题不影响使用,只是启动的时候会报一些错误,后面就是一个硬排查的过程。直接定位到报错的地方,发现ShardingSphere在启动的时候加载了表的一些元数据信息,报错了。看到这个地方,很明显是地图去get的时候报错了。一去源码,发现这里定义了TreeMap,所以应该没什么问题,但是上面的dataType是null,所以报错了,不过我还年轻。问题原因我们已经定位到上面出现问题的地方了,接下来分析为什么会出现这个问题?从源码来看,这个地方主要是加载数据库表的列的元数据信息。在这个类中发现了拼接的SQL查询语句,主要是查看information_schema下的columns表。这个时候想看看为什么会这样,于是打开本地debug查看没有问题,再去测试环境下发现没有问题。好像只有production有这个问题。这个dataTypeMap是一个列类型的映射,但是本地没有办法重现。如果本地没有解决办法,那就按照上面的SQL去生产库看看COLUMNS表的字段有什么问题。查询后发现有很多null和一些其他乱七八糟的类型。似乎NPE的原因是因为这些空值。那么这些空值从何而来呢?经查,发现views是从TIDB生成的。没有办法重现本地和测试,因为用的是Mysql。查这个环境问题还是挺恶心的,因为没有TIDB环境,只能自己装一个,想办法重现(过程很耗时)。好在Mac上安装这些东西很方便,安装,刷新环境变量,启动。1.curl--proto'=https'--tlsv1.2-sSfhttps://tiup-mirrors.pingcap....|sh2.source${your_shell_profile}3.tiupplayground在本地按照非常沙雕的创建视图的方法创建视图,然后在本地DEBUG中查看。进来看看,和我一开始想的不一样,居然是一个空字符串,不是我想象中的null,这么看来这应该不会报空指针吧?!想不通为什么这里是空的,就打开这个类看了看。嗯???这狗屎???????会不会是拆包引起的?嗯,没错。dataTypeMap.get(dataType)为null,拆箱调用什么不用我说了,就是这个道理。..你说的维修是什么意思?有同学说,不容易啊,你是沙雕吗?更改为Integer是不够的。嗯,你是对的,我只是改变了它。然后,修改之后,启动就是一堆报错,到处都是调用。这东西不能动,他好像在告诉我,试着动一下,动了你就死了。文章写到这里,还没想好怎么改。大概有3种解决方案:彻底去掉TIDB,使用view的蛮横操作,从根源上解决问题。按照这个方法,改成Integer,但是不知道改多少这个问题可以通过不加载view的metadata来避免。毕竟,如今谁在使用视图?让每个人都有机会为他们提高PR。