场景问题: VisualVM工具Profiler JDBC不是真实执行的SQL

1. 问题

诡异的问题表象: 前端反馈分页接口的Total字段一直为0

使用Visualvm中的 Profiler 注入到应用后,查看JDBC监控得到了分页接口执行的SQL,复制出来执行是55. 此时还没有注意到 IN 的范围中有一个特别的值 'NULL' 🤨

在这里插入图片描述

2. 排查

开始查使用到的Mybatis plus分页插件是不是有bug,debug一轮发现SQL执行的结果就是0 然后才赋值给的IPage对象 😢 这下更奇怪了

重放请求,继续! 往JDBC执行SQL的入口去找,就不信是DataGrip的问题,然后在MySQL的驱动中发现 com.mysql.cj.NativeSession#execSQL 执行的SQL是 SELECT COUNT(*) ... id NOT IN (null, 128, 129) emmm 迷茫🤨

根据MySQL官方文档所描述 operator IN() 可以确认这个 id not in 子句永远会返回null 所以不会有符合条件的数据 count为0。

To comply with the SQL standard, IN() returns NULL not only if the expression on the left hand side is NULL, 
but also if no match is found in the list and one of the expressions in the list is NULL. 

好了,只要在应用代码中加个过滤空问题就解决了🤣

又是一个低级错误导致表象看起来不可思议问题的案例

问题又来了,为什么visualvm中监控到的SQL是 in ( 'NULL' ) 呢 😟

看了下这个项目大部分是Java代码,拉他代码瞅瞅,拉下来发现是古早的ant项目,emmm 在IDE中调试的想法直接放弃,转而从GUI入手, 找到这个界面对应的代码 ProfilerJDBCPanel

但是由于没构建,只能手动搜文件和字符串去找调用关系,总所周知项目中SQL的执行基本都是用PreparedStatement, 传入的只有模板和参数,真实SQL是驱动构建的,visualvm 同样要走这一步。

看了一会发现一个可疑的方法 org.graalvm.visualvm.lib.jfluid.results.jdbc.SQLStatement#getFullSql 。 通过 arthas watch 这个方法后,确认了是这里返回了错误的SQL。😓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/511267.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rabbitmq消息丢失-生产者消息丢失(一)

说明:消息生产者在将数据发送到Mq的时候,可能由于网络等原因造成数据投递失败。 消息丢失大致分三种:这里说的是生产者消息丢失! 分析原因: 1.有没有一种可能,我刚发送消息,消息还没有到交换…

06-prometheus的数据存储

一、本地存储prometheus收集的监控数据 就是将默认的存储,修改为“我们指定”的目录下; 1,配置systemctl启动文件 [rootprometheus-server32 ~]# vim /etc/systemd/system/prometheus-server.service [Unit] DescriptionPrometheus Server D…

第五套CCF信息学奥赛c++练习题 CSP-J认证初级组 中小学信奥赛入门组初赛考前模拟冲刺题(阅读程序题)

第五套中小学信息学奥赛CSP-J考前冲刺题 二、阅读程序题 (程序输入不超过数组或字符串定义的范围&#xff0c;判断题正确填√错误填X;除特殊说明外&#xff0c;判断题 1.5分&#xff0c;选择题3分&#xff0c;共计40分) 第一题 递归函数 1 #include<iostream> 2 usin…

使用 helm repo add istio添加了一个helm chart repo,如何查看istio的版本呢

1. 添加chart repo helm repo add istio https://istio-release.storage.googleapis.com/charts helm repo update2. 查看版本 helm search repo istio 3. 查看版本详细信息 helm show chart istio/cni 4. 查看某个chart的历史版本 helm search repo <chart-name> --…

适用于 Windows 的7大数据恢复软件解决方案

数据丢失是数字世界中令人不快的一部分&#xff0c;它会在某一时刻影响许多计算机用户。很容易意外删除一些重要文件&#xff0c;这可能会在您努力恢复它们时带来不必要的压力。幸运的是&#xff0c;数据恢复软件可以帮助恢复已删除的文件&#xff0c;即使您没有备份它们。以下…

绝地求生:小团团曝被判8年:地图语音包或将下架,公会和主播被一锅端

这两天大家都在讨论某鱼平台办卡抽奖的事情。这件事发生之后没多久&#xff0c;某鱼平台里面的大量主播在同一时间停播&#xff0c;闲游盒认为大家应该也懂的&#xff0c;这次停播就是因为这些主播也参与了办卡抽奖&#xff0c;都需要接受调查&#xff0c;在两个月左右的调查中…

关于vue创建项目以及关于eslint报错的问题

vue创建完项目以后如果报parsing error no babel config file。。。这样的错误的话&#xff0c;关闭项目&#xff0c;用vscode进入项目中打开项目就可以解决了。 1 代码保存的时候会自动将单引号报错为双引号 导致eslint报错的问题&#xff0c; 解决思路&#xff1a; 在项目根…

STM32自学☞I2C

这里只是大体介绍&#xff0c;具体的可参考STM32数据手册

mysql学习笔记7——数据库查询深入

.sql文件 在实际使用数据库时&#xff0c;常常要对数据库文件进行备份&#xff0c;以便在数据库遭到入侵或者非人为因素导致损坏后&#xff0c;快速恢复数据 .sql文件便提供了这种功能&#xff0c;首先.sql文件是由一串串mysql指令组成的&#xff0c;我们插入.sql文件实际相当…

加密与安全_ 凯撒密码

文章目录 Pre概述Code 实现 凯撒密码字母频率分析攻击Code解密凯撒密码 小结 Pre PKI - 02 对称与非对称密钥算法 概述 凯撒密码是一种简单的替换加密技术&#xff0c;也称为移位密码。它是古典密码学中最早的密码之一&#xff0c;得名于古罗马军队领袖凯撒尤利乌斯&#xff…

『Linux从入门到精通』第 ㉕ 期 - System V 共享内存

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;共享内存原理&#x1f427;共享内存相关函数&#x1f426;key 与 shmid 区别 &#x1f427;代码实例 &#x1f490;专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0…

用Arduino中Wire库写I2C驱动-提高篇(IP2368芯片驱动为例)

之前写了一篇文章“用Arduino中Wire库写I2C驱动-入门篇”&#xff0c;链接地址&#xff1a;用Arduino中Wire库写I2C驱动-入门篇_arduino wire库-CSDN博客对I2C驱动编写做了一个简单的介绍&#xff0c;这一篇里&#xff0c;我们将使用IP2368这个芯片为例&#xff0c;详细的讲解一…