加载中...

每日一记

  • StopWatch计算代码耗时
  • 如何解决MySQL主从延时
  • BeanUtils.copyProperties

StopWatch计算代码耗时

来自:org.springframework.util.StopWatch;

public static void main(String[] args) throws InterruptedException {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start("a");
        Thread.sleep(1000); // 在这里写需要测试耗时的代码
        stopWatch.stop();

        stopWatch.start("b");
        Thread.sleep(2000);
        stopWatch.stop();

        stopWatch.start("c");
        Thread.sleep(3000);
        stopWatch.stop();

        System.out.println(stopWatch.getTotalTimeMillis()); // 输出任务总耗时
        System.out.println();
        System.out.println(stopWatch.getLastTaskTimeMillis()); // 输出最后一个任务的耗时
        System.out.println();
        System.out.println(stopWatch.prettyPrint());  // 以表格形式打印结果 单位ns

    }

任务结果:

如何解决MySQL主从延时

前置知识

  • 什么是主从延时:主从库在同一时间出现数据不一致。(个人理解)

  • 主从复制原理:

流程:写入binlog(耗时t1),传递binlog并且 从库同步到relaylog(耗时t2),

​ SQL thread 执行relaylog(耗时t3)。

其中影响最大的是t3

解决方法

  • 提高物理机性能(特别是从库所在机)

  • 避免大事务(分批执行,减少t3)

  • 优化带宽(减少t1和t2)

  • 使用Redis做一层缓存(解决主从延时就是解决主从数据库数据不一致问题)

  • 直接查询主库(核心业务场景可以使用)

  • 升级MySQL版本(高版本支持多线程复制)

BeanUtils.copyProperties 不推荐使用

理由:

  • 同一类型属性不同时会拷贝失败,但不会报错(若一个是基本类型,一个是对应包装类,会报错)

  • 已赋值属性会被覆盖

    exp:  A 类 和 B 类 都有 名字和年龄。
    A 初始化 name = null , age = 18;
    B 初始化 name = "小强", age = null;
    BeanUtils.copyProperties(A,B);
    B 的名字会改为null
    
  • 属性拷贝由方法内部实现,难以溯源

  • 内部类是无法成功拷贝

  • 该拷贝是浅拷贝

  • 底层是反射机制,效率低下。

    可以用联合上面的stopwatch来进行测试:

    public static void main(String[] args) throws InterruptedException {
            StopWatch stopWatch = new StopWatch();
            A a = new A();
            a.setName("小强");
            B b = new B();
            
            stopWatch.start("工具拷贝");
            for (int i = 0; i < 10000; i++) {
                BeanUtils.copyProperties(a,b);
            }
            stopWatch.stop();
    
            stopWatch.start("方法拷贝");
            for (int i = 0; i < 10000; i++) {
                b.setName(a.getName());
            }
            stopWatch.stop();
    
            System.out.println(stopWatch.prettyPrint());  // 以表格形式打印结果
        }
    

测试结果:

可以发现各测试10000组,绝大多数时间均由BeanUtils.copyProperties使用。效率低下。

posted @ 2023-12-28 18:08  strind  阅读(15)  评论(0)    收藏  举报