热门标签 | 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。



推荐阅读
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
    在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
  • 清华大学出版社 | 杨丹:基于MATLAB机器视觉的黑色素瘤皮肤癌检测技术及源代码分析(第1689期)
    清华大学出版社 | 杨丹:基于MATLAB机器视觉的黑色素瘤皮肤癌检测技术及源代码分析(第1689期) ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 深入解析 Android TextView 中 getImeActionLabel() 方法的使用与代码示例 ... [详细]
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社区 版权所有