当前位置: 首页 > article >正文

线上bug-接口速度慢

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,双非大四,Java实习中…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:接下来的三个月里,对梦想的追逐 ");

背景

在周五的下午,小符已经打开了bilibili,正打算继续摸鱼…

新哥问我是不是没事干呀…于是指给我了一个线上bug,让我修一下

bug是调用接口太慢了,长达19s的耗时,这不得不让客户怀疑 ”诶,怎么不动了,我卡死了吗!“ 用户体验很不好。

开始

拿到bug之后,小符也一脸懵呀,其实我想先判断是否是后端的问题呢,但好像有点多余,,ld把另一个项目的代码权限给我加上了,因为另一个项目有个类似的功能且没有bug,我对比着看一下。

果然…我看了一下午之后,并没有发现什么特别的,数据库交互的次数也都是2次。

新哥看我一筹莫展,给我说了一下思路,可以把2次查询优化到一次查询。于是周五快乐的下班了…

后来

周一又到了上班的时间,想要复现接口查询慢时,又发现了原因。我只是一个小小的实习生呀,不能直接进行线上操作的。

在本地复现bug,写了段代码向数据库插入1w条数据,执行了50分钟。插入1w条数据之后呢,再次执行本地也仅耗时3s左右,但也很满足了。

优化代码后的执行操作时2.2s,提高了40%左右,这波优化并不完美啊!但实力有限,就这样把bug提交了,不知后面会不会再次@小符优化这个bug

过程

学习trino查询引擎架构体系,大致了解了一下
请添加图片描述
trino提供了统一查询接口,可以跨不同的数据源进行数据的查询。通过统一sql访问各类的数据源,比如mysql、redis、Oracle、db2等等。大幅度提高了查询效率,也简化了代码。

bug本地复现,随便写一段代码能插1w条数据,把时间提上去就行

public class GetConnection {
    public static void getConnection() throws SQLException, ClassNotFoundException {

        Class.forName("io.trino.jdbc.TrinoDriver");
        TimeZone.setDefault(TimeZone.getTimeZone("+08:00"));
        String url = "jdbc:trino://1.2.3.4:8081/hive/a";
        Properties properties = new Properties();
        properties.setProperty("user", "abc");
        properties.setProperty("password", "123456");
        Connection connection = DriverManager.getConnection(url, properties);
        Statement statement = connection.createStatement();
        
        String insertSql = "INSERT INTO A (a1, a2, a3, a4, a5) VALUES (?, ?, ?, ?, ?)";
        PreparedStatement preparedStatement = connection.prepareStatement(insertSql);
        long start = System.currentTimeMillis();

        for (int i = 1; i < 10000; i++) {
            AA data = new AA("A1" + i, "A2" + i, "A3" + i, "A4" + i, "A5" + i);
            preparedStatement.setDouble(1, data.getA1());
            preparedStatement.setString(2, data.getA2());
            preparedStatement.setString(3, data.getA3());
            preparedStatement.setString(4, data.getA4());
            preparedStatement.setString(5, data.getA5());

            preparedStatement.addBatch();
            System.out.println(i);
        }

        preparedStatement.executeBatch();
        long end = System.currentTimeMillis();
        System.out.println("1w次总耗时:"+(end - start) + "ms");

        connection.close();

    }
	public static void main(String [] args) throws SQLException, ClassNotFoundException {
		GetConnection.getConnection();
		System.out.println("11111");
	}

}

利用postman和arthas的trace命令进行优化前后的一个追踪和测试…


结束的有点潦草了…太困了 睡觉去了


http://www.kler.cn/news/135990.html

相关文章:

  • Spring Boot - 自定义注解来记录访问路径以及访问信息,并将记录存储到MySQL
  • 解决 Python requests 库中 SSL 错误转换为 Timeouts 问题
  • 使用 Core Tools 在本地开发 Azure Functions
  • 【图数据库实战】-HugeGraph系列
  • SpringCloud 微服务全栈体系(十四)
  • 【brpc学习案例实践一】rpc服务构造基本流程
  • 彻底解决electron-builder安装问题与npm下载配置问题
  • Docker发布简单springboot项目
  • C++ 删除无头链上所有指定值为x的节点。
  • Redis设计与实现-数据结构(建设进度15%)
  • Re50:读论文 Large Language Models Struggle to Learn Long-Tail Knowledge
  • ubuntu 查看5000端口是否开放
  • 2023 极术通讯-汽车“新四化”路上,需要一片安全山海
  • 享元模式学习
  • 艾泊宇产品战略:灵感于鬼屋,掌握打造卓越用户体验的关键要素
  • C#单例模式懒汉式与饿汉式
  • CentOS 8搭建WordPress
  • 原理Redis-ZipList
  • cp: can‘t stat ‘/usr/share/zoneinfo/Asia/Shanghai‘: No such file or directory
  • 【多线程 - 11、死锁】
  • 原理Redis-Dict字典
  • 【zabbix监控四】zabbix之监控tomcat服务报警
  • 【Java 进阶篇】Ajax 实现——JQuery 实现方式 `get` 与 `post`
  • Android studio run 手机或者模拟器安装失败,但是生成了debug.apk
  • golang[ssa callgraph] 获取调用图实战
  • Jmeter做接口测试
  • 【C++】基础语法(中)
  • Python顺序结构程序设计
  • c语言:矩阵交换
  • C/C++多级指针与多维数组