• 异常处理之EnhancedServiceNotFoundException


    一、前言

    最近公司项目需要用到分布式事务,简单了解后,准备接入seata事务,但在对接的过程中报了错。
    大致思路:一个用户表、一个用户附加信息表,两个表在不同库,在新增用户中需要同时新增用户附加信息,这个时候就涉及到分布式事务。

    二、错误信息

    在调用新增用户接口时,报错

    Caused by: io.seata.common.loader.EnhancedServiceNotFoundException: not found service provider for : io.seata.sqlparser.druid.SQLOperateRecognizerHolder
    
    • 1

    这个大致是没有找到服务的意思。

    三、造成原因

    seata不支持sqlserver

    四、排查过程

    1.先搜索这个异常信息:EnhancedServiceNotFoundException
    在这里插入图片描述

    2.再次打上断点,调试,可以看到如下图示,进入了我们所在断点位置
    在这里插入图片描述

    3.直接点击下方debugger窗口下的代码运行流程,往下看依次调用了哪些方法,可以看到,第二个步骤是直接抛出了本次异常,继续往下看。
    在这里插入图片描述

    4.这个是去获取指定的扩展类,似乎问题就出在这里了,点进方法进去看下
    在这里插入图片描述
    5.可以看到,这个nameToDefinitionsMap里的值,只有三个,没有我所需要的sqlserver,这个是一个无法改变的常量,在服务启动时就已经加载。问题就出在这里,我项目所需要的是sqlserver数据库,而seata服务里配置的是mysql数据库,这里就需要去把这个变量加上sqlserver,但这是源码包里的,暂时无方法解决。
    在这里插入图片描述
    在这里插入图片描述

    五、解决方案

    将nameToDefinitionsMap变量配置上sqlserver,因为涉及到源码,暂时无解决方案,不过知道问题出在哪儿,就有地方下手解决了,后续解决了,会提供上完整的解决方案步骤。

    六、反思总结

    刚开始遇到这个bug的时候,我依然如往常一样,复制错误信息,准备到网上查找,但搜索到的全都无法解决我所遇到的问题。最后,去请教了公司的一个大佬,他的排查过程就像是给我混乱的大脑的一记响钟,让我从以往那种不明不白的状态有了一丝清晰的思路。以往我都不敢去接触这种底层的代码,现在我对这种跟踪排查有了新的认识。

  • 相关阅读:
    【LeetCode每日一题】——38.外观数列
    基于MySQL的事务管理
    matlab根轨迹绘制
    etcd java 客户端jetcd库踩坑日志
    Python武器库开发-flask篇之Get与Post(二十五)
    036、目标检测-锚框
    用Java来实现elasticsearch的查询,如何用log在后台打印出对应的查询语句
    网络基础原理概述
    BGP基础
    全志H616语言控制刷抖音小项目(守护进程、udev机制)
  • 原文地址:https://blog.csdn.net/ShanLanF/article/details/126343056