mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7mobile wallpaper 8mobile wallpaper 9mobile wallpaper 10mobile wallpaper 11mobile wallpaper 12
723 字
2 分钟
Sharding-JDBC 定时任务 SQL 无响应的解决方案
2025-07-07

我在使-进行分库分表的时候遇到了这样一个问题:

明明和数据库连接都确认无误,但在定时任务中执行的时候出现了问题。

打印都很正常对吧。

按理说接下来就会打印sql语句以及对应的参数和返回结果,可是代码在执行到这似乎就停下来了,控制台也没有进一步的输出,也没有抛出任何异常,就像线程阻塞了一样。

于是我就开始排查寻找问题所在,可是找来找去似乎都没有任何问题。

这时我考虑到可能是日志级别屏蔽了错误信息,所以我在配置文件调整了日志输出级别,果不其然,控制台打印出来了报错信息:

java.lang.NullPointerException: Cannot invoke “java.lang.ClassLoader.getResourceAsStream(String)” because the return value of “java.lang.Thread.getContextClassLoader()” is null

可以看到这个报错信息是Sharding-JDBC在尝试获取类加载器的时候获取到了null值从而抛出的空指针异常。也就是说当前线程并没有对应的加载器。

Sharding-JDBC 依赖类加载器来加载和解析配置文件等资源。如果无法获取到有效的类加载器,即使配置文件本身完全正确,Sharding-JDBC 也无法成功读取和初始化配置,其行为就会如同配置缺失一样。 这就是为什么程序看似“卡住”而没有预期输出——核心功能初始化失败了。

为什么当前线程没有对应的类加载器呢?

在Tomcat 容器中处理普通请求的线程,在创建时通常会被容器显式设置一个默认的类加载器。这确保了线程在执行应用代码时能正确加载所需的类。

然而,定时任务线程的情况则不同。Spring 框架在执行定时任务时,默认使用的是内置的 ScheduledThreadPoolExecutor 线程池。关键点在于:ScheduledThreadPoolExecutor 在创建新的工作线程时,并不会自动设置线程的上下文类加载器。

既然根本原因是当前线程缺少上下文类加载器,解决方案就是显式地为该线程设置一个有效的类加载器。在的执行逻辑开始处,添加以下代码:

// 显式设置类加载器
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());

添加上述代码后,Sharding-JDBC 能够成功获取到所需的类加载器,顺利加载配置并初始化。程序随即恢复正常运行,预期的 SQL 日志和执行结果都能在控制台正确输出。


原文链接: Sharding-JDBC 定时任务 SQL 无响应的解决方案 作者: Yilena

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Sharding-JDBC 定时任务 SQL 无响应的解决方案
https://blog.csdn.net/2401_88959292/article/details/148366254?spm=1001.2014.3001.5501
作者
Yilena
发布于
2025-07-07
许可协议
CC BY 4.0

部分信息可能已经过时

相关文章 智能推荐
1
通过mysqldump进行数据迁移时权限不足的解决方案
故障排查 本文针对使用mysqldump进行MySQL数据迁移时遇到的“Access denied”权限不足报错(错误码1227)提供了有效的解决方案。通过分析报错日志,指出问题根源在于导出的SQL文件中包含了与GTID(全局事务标识)相关的语句,而逻辑导入通常无需参与GTID复制链路。文章给出了在生成SQL文件时添加`--set-gtid-purged=OFF`参数的解决办法,并额外提醒了DataGrip默认勾选`lock tables`可能导致的业务阻塞风险,建议在InnoDB引擎下使用`--single-transaction`以获取一致性快照,确保迁移过程平稳安全。
2
Docker部署的xxl-job执行本地任务时无法连接执行器的解决方案
故障排查 本文针对使用Docker部署xxl-job并调度宿主机本地任务时出现的“无法连接执行器”及连接超时问题,进行了深入的原因分析与解决。指出问题根源在于Docker默认创建的虚拟网卡导致跨网段不可达,使得自动注册的执行器IP无法被外部访问。文章提供了两种切实可行的解决方案:一是手动将执行器IP配置为宿主机的公网可路由地址;二是在启动Docker容器时通过`--network=host`参数指定网络命名空间,使容器共享宿主机网段,从而彻底解决网络隔离带来的调度失败问题。
3
FastJson日期类无法解析的解决方案
故障排查 本文针对在Spring Boot项目中引入FastJson2依赖后,实体类日期字段(如Date类型)解析失败并抛出MethodArgumentNotValidException异常的问题,进行了深入分析。指出问题根源在于Spring MVC默认的日期转换器覆盖了FastJson的配置,导致非JSON请求体与JSON请求体的转换逻辑分离。文章提供了两种有效的解决方案:一是通过在字段上添加`@DateTimeFormat`注解指定解析格式;二是通过实现`WebMvcConfigurer`接口全局配置日期转换器(DateFormatter),以统一处理日期格式的解析与格式化。
4
Knife4j未配置却需要登录认证的解决方案
故障排查 本文针对在Spring Boot项目中使用Knife4j时,未配置登录认证却意外弹出登录页面的问题提供了解决方案。通过排查发现,该登录拦截并非来自Knife4j自身配置,而是由项目中引入的Spring Security框架触发。文章给出了两种解决思路:一是直接移除不必要的Spring Security依赖;二是在保留Security框架的前提下,通过配置`SecurityFilterChain`,将Knife4j的核心资源路径(如`/doc.html`、`/v3/api-docs/**`等)加入白名单予以放行,从而完美解决接口文档访问受限的问题。
5
有关IDEA中Lombok失效、找不到符号问题的解决方案
故障排查 本文针对在IDEA中使用Lombok时遇到的注解失效及编译时"找不到符号"的常见问题,提供了切实有效的解决方案。作者通过实践发现,问题的根源往往在于未明确指定Lombok依赖的版本。文章详细列出了需要在pom.xml中指定Lombok版本号(如1.18.30)的三个关键位置:依赖声明、maven-compiler-plugin的annotationProcessorPaths配置以及excludes配置。此外,还补充了在Spring Boot父工程环境下,通过pluginManagement统一配置编译插件以彻底解决该问题的进阶方法。

目录

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00