美文网首页
springboot集成elastic-job后服务启动阻塞

springboot集成elastic-job后服务启动阻塞

作者: growing_hawk | 来源:发表于2019-06-04 20:25 被阅读0次

    问题描述

    将mysql-connector-java从5.1.46版本升级到8.0.15版本后,服务启动时间从原来的30秒增长到了将近15分钟

    解决方案

    在数据库连接URL中加入参数:nullCatalogMeansCurrent=true

    问题分析

    1、先查看启动日志,发现启动时quartz每个任务执行时间间隔在1分钟以上,推断是quartz的调度有耗时操作

    2、debug分析任务调度入口,循环每个job并创建调度对象,确实每次创建调度对象SpringJobScheduler都很耗时

    3、继续debug elastic-job创建调度对象的过程,在事件总线EventBus中加入了监听者JobEventRdbListener,此监听者订阅事件并将事件入库,实际数据库操作是通过创建JobEventRdbStorage对象执行,在此类中初始化需要的表

    4、在进行表的初始化时,先判断表是否存在:1)获取数据库元数据DatabaseMetaData;2)通过元数据查找所需的表JOB_EXECUTION_LOG,注意此处在查询表是否存在时,传入的参数catalog为null

    5、debug发现getTables方法耗时很长,再继续跟踪发现getTables方法中在执行时获取了所有数据库,并循环查找表JOB_EXECUTION_LOG(db有1000个以上),阻塞就发生在此处

    5、为什么5.1.46版本不会阻塞,而8.0.15版本会发生阻塞?对比分析后找到根本原因:

                5.1.46版本使用了com.mysql.jdbc.Driver,创建的数据库连接JDBC4Connection中nullCatalogMeansCurrent属性默认为true,当参数catalog传入为null时,只取到当前库进行遍历;

                8.0.15版本使用了com.mysql.cj.jdbc.Driver,创建的数据库连接ConnectionImpl中nullCatalogMeansCurrent默认为false,当参数catalog传入为null时,导致取到了所有的库进行遍历;

    相关文章

      网友评论

          本文标题:springboot集成elastic-job后服务启动阻塞

          本文链接:https://www.haomeiwen.com/subject/npbrxctx.html