• 线上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");
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

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


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

  • 相关阅读:
    华为摄像头智能安防监控解决方案
    探究多态的原理与实现:虚函数表、动态绑定与抽象类
    视频去LOGO的方法,AI自动完美地去除视频LOGO
    Jmeter安装与测试
    MySQL之优化服务器设置(六)
    简历自动生成工具
    Spring Security 集成 Authing CAS 认证(一)
    《web课程设计》用HTML CSS做一个简洁、漂亮的个人博客网站
    2024.3.12
    1分钟实现 CLIP + Annoy + Gradio 文搜图+图搜图 系统
  • 原文地址:https://blog.csdn.net/weixin_57780057/article/details/134522066