热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

可恶,又是个线上问题!

这几天,在搞ShardingSphere,这不又来了一个问题嘛,启动的时候报了一个NPE出来。好在,这个问题不影响使用&#x

这几天,在搞 ShardingSphere,这不又来了一个问题嘛,启动的时候报了一个NPE出来。

eee9845603e65c4a191c1a7f0964470a.jpeg

好在,这个问题不影响使用,只是启动会报点错,接下来,又是辛苦的排查过程。

直接定位到报错的地方,发现是ShardingSphere在启动时候去加载表一些元数据信息报错,看到这个地方就很明显的猜测是 map 去 get 的时候报错了。

2f6c959ed39f71b54ffa2813e637b9da.jpeg

一通往上翻源码,发现这里定义的是 TreeMap,那应该没毛病了,就是上面 dataType 是个 null,所以报错了,可是我还是年轻了。

c5e45e30832ed45fb98a055f187e4a54.jpeg

问题原因

上面我们已经定位到问题出现的地方,接下来就分析下为什么会出现这个问题呢?

从源码看到,主要是在这个地方去加载数据库表的列的元数据信息。

80aff29251e0897f193953337a5b88ab.jpeg

在这个类里发现了拼接的 SQL 查询语句,主要是去查 information_schema 下面的 columns 表。

3310abc1b98b40e1802daaadb82a2181.jpeg

这时候我想看下这个到底是为啥,于是打开本地 debug 看了一下没有任何问题,然后去测试环境上发现也没有问题,好像只有生产有这个问题。

这个 dataTypeMap 就是列类型的一个映射,但是本地没有办法重现。

c6dc0e9d99cf7fee0f0b7d85a96463f0.jpeg

本地没有办法的话,那就根据上面的 SQL 去生产库里看了下 COLUMNS 表这个字段有啥问题,查询一看,发现了一大堆的 null,还有一些其他的乱七八糟的类型,那看来 NPE 的原因就是因为这些 null 了。

49868dbbd078460e40ee567c063e0e8f.jpeg

那这些 null 值是怎么来的呢?根据排查发现都是来自 TIDB 的视图生成的。本地和测试没有办法重现是因为其实用的是 Mysql。

7de13f6721862292e40eaad2f0a8f2b3.jpeg

排查

这个环境问题还挺恶心的,因为没有 TIDB 的环境,只能自己装一个了去想办法重现一下了(过程很费时间)。

好在 Mac 装这些东西还是很方便的,安装、刷新环境变量、启动。

1. curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
2. source ${your_shell_profile}
3. tiup playground

然后本地按照那个很沙雕的创建视图的方法创建个视图出来,再本地 DEBUG 看看。

进来一看,和开始想的不一样,居然是个 null 字符串,不是我想象中的 null,那这个看起来不应该会报空指针才对啊?!

a9631e60bd56bf2991fc2130ac986ba4.jpeg

有点想不通为啥这里会空,然后打开这个类看了一眼。

嗯???

这尼玛??

?????

难道是拆箱导致的?

0b09de71073ebf6423e645ee039f710e.jpeg

好吧,没错。dataTypeMap.get(dataType) 是 null,拆箱调用的啥我不用说了吧,就是这原因。。。

修复

你说咋改?

有同学说了,那还不简单,你是个沙雕吗?改成Integer不就完事儿了。

嗯,你说的没错,我就这么改了。

然后,改完之后启动又是一堆报错,到处存在调用。

这玩意儿不能动,他仿佛在和我说,你动动试试,果然动动就逝世。

fa44f82487900f190530cd032d43e744.jpeg

文章写到这里,我还没想好怎么改,大概有 3 个方案:

  1. 完全去掉 TIDB 还用视图这离谱的操作,从根源上解决问题

  2. 按照这个方法,改成 Integer,就是不知道要改多少地方

  3. 不去加载视图的元数据,就可以避免这个问题了,毕竟这年头谁用视图啊

给大家个机会,去给他们提个 PR。



推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 求解连通树的最小长度及优化
    本文介绍了求解连通树的最小长度的方法,并通过四边形不等式进行了优化。具体方法为使用状态转移方程求解树的最小长度,并通过四边形不等式进行优化。 ... [详细]
author-avatar
国王的驴耳朵要吐槽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有