线上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条数据之后呢,再次执行本地也仅耗时2.39s左右,但也很满足了。

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

测试组的同学测试了60字段 500w的数据结果是从23.86s优化到了11.14s,在原来的基础上提升了一倍多的速度

解决过程

学习trino查询引擎架构体系,大致了解了一下

trino提供了统一查询接口,可以跨不同的数据源进行数据的查询。通过统一sql访问各类的数据源,比如mysql、redis、Oracle、db2等等。大幅度提高了查询效率,也简化了代码。

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

java 复制代码
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:9999/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.setString(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命令进行优化前后的一个测试和追踪...

这是未优化时的耗时,可知总耗时是2.39s,深入追踪发现耗时原因主要是由于2条查询导致的。

优化掉一条查询后,再次进行追踪查看,发现总耗时为1.252s,查询时间为1.215s,提高了速度。

最后

慢慢的来,别着急!学会有质量的走过每一步

我是代码不会敲的小符,希望认识更多有经验的大佬,也在努力摸索出自己的道路

欢迎添加小符微信:A13781678921,一起加油

相关推荐
艾迪的技术之路13 分钟前
redisson使用lock导致死锁问题
java·后端·面试
今天背单词了吗98031 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
天天摸鱼的java工程师34 分钟前
使用 Spring Boot 整合高德地图实现路线规划功能
java·后端
东阳马生架构1 小时前
订单初版—2.生单链路中的技术问题说明文档
java
咖啡啡不加糖1 小时前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南1 小时前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
DKPT1 小时前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式
Percep_gan1 小时前
idea的使用小技巧,个人向
java·ide·intellij-idea
缘来是庄1 小时前
设计模式之迭代器模式
java·设计模式·迭代器模式