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

问题描述

将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后服务启动阻塞)