可恶,又是个线上问题

这几天,在搞 ShardingSphere,这不又来了一个问题嘛,启动的时候报了一个NPE出来。
图片
好在,这个问题不影响使用,只是启动会报点错,接下来,又是辛苦的排查过程。直接定位到报错的地方,发现是ShardingSphere在启动时候去加载表一些元数据信息报错,看到这个地方就很明显的猜测是 map 去 get 的时候报错了。
图片
一通往上翻源码,发现这里定义的是 TreeMap,那应该没毛病了,就是上面 dataType 是个 null,所以报错了,可是我还是年轻了。
图片
问题原因上面我们已经定位到问题出现的地方,接下来就分析下为什么会出现这个问题呢?从源码看到,主要是在这个地方去加载数据库表的列的元数据信息。
图片
在这个类里发现了拼接的 SQL 查询语句,主要是去查 information_schema 下面的 columns 表。
图片
这时候我想看下这个到底是为啥,于是打开本地 debug 看了一下没有任何问题,然后去测试环境上发现也没有问题,好像只有生产有这个问题。这个 dataTypeMap 就是列类型的一个映射,但是本地没有办法重现。
图片
本地没有办法的话,那就根据上面的 SQL 去生产库里看了下 COLUMNS 表这个字段有啥问题,查询一看,发现了一大堆的 null,还有一些其他的乱七八糟的类型,那看来 NPE 的原因就是因为这些 null 了。
图片
那这些 null 值是怎么来的呢?根据排查发现都是来自 TIDB 的视图生成的。本地和测试没有办法重现是因为其实用的是 Mysql。
图片
排查这个环境问题还挺恶心的,因为没有 TIDB 的环境,只能自己装一个了去想办法重现一下了(过程很费时间)。好在 Mac 装这些东西还是很方便的,安装、刷新环境变量、启动。 1. curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.... | sh 2. source ${your_shell_profile} 3. tiup playground然后本地按照那个很沙雕的创建视图的方法创建个视图出来,再本地 DEBUG 看看。进来一看,和开始想的不一样,居然是个 null 字符串,不是我想象中的 null,那这个看起来不应该会报空指针才对啊?!
图片
有点想不通为啥这里会空,然后打开这个类看了一眼。嗯???这尼玛???????难道是拆箱导致的?
图片
好吧,没错。dataTypeMap.get(dataType) 是 null,拆箱调用的啥我不用说了吧,就是这原因。。。修复你说咋改?有同学说了,那还不简单,你是个沙雕吗?改成Integer不就完事儿了。嗯,你说的没错,我就这么改了。然后,改完之后启动又是一堆报错,到处存在调用。这玩意儿不能动,他仿佛在和我说,你动动试试,果然动动就逝世。
图片
文章写到这里,我还没想好怎么改,大概有 3 个方案:完全去掉 TIDB 还用视图这离谱的操作,从根源上解决问题按照这个方法,改成 Integer,就是不知道要改多少地方不去加载视图的元数据,就可以避免这个问题了,毕竟这年头谁用视图啊给大家个机会,去给他们提个 PR。


192 声望
68 粉丝
0 条评论
推荐阅读
RabbitMQ、RocketMQ、Kafka延迟队列实现
延迟队列在实际项目中有非常多的应用场景,最常见的比如订单未支付,超时取消订单,在创建订单的时候发送一条延迟消息,达到延迟时间之后消费者收到消息,如果订单没有支付的话,那么就取消订单。

艾小仙阅读 911

Spring事务传播行为详解
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的工具箱,使用事务传播行可...

JerryTse242阅读 122.7k评论 97

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木75阅读 7.1k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木45阅读 8.5k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木35阅读 6.7k评论 10

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go33阅读 2.4k评论 1

封面图
从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 5k评论 9

192 声望
68 粉丝
宣传栏