人大金仓KFS数据同步系统中KingbaseXLogicalExtractor类的拆分解耦

KingbaseXLogicalExtractor类的拆分解耦

关键字:

Kingbase FlySync、KingbaseXLogicalExtractor、拆分解耦

关于KingbaseXLogicalExtractor类

在Extractor模块在系统中负责源端数据抽取,体现在代码中对应了超级父类Extractor和包装类ExtractorWrapper,这两个类以方法的形式定义了extractor所要实现的基础功能,针对不同的数据源,包中提供了一系列子包完成系统对不同数据源数据抽取的实现,包括oracle、mysql、kingbase、rabbitmq等,其中kingbase包提供了以kingbase作为源数据库的数据抽取的实现,系统为kingbase源端数据抽取提供了两种方式,一种是根据redo日志抽取,一种是根据xlogical方式抽取,KingbaseXLogicalExtractor就是根据xlogical抽取数据的重要实现类,其中对configure、prepare、setLastEvent、extract、release这五个extract流程分别做了重写,除此之外,类中还包含了大量的私有方法为流程中的各个模块提供实现,是kingbase作为数据源根据xlogical进行数据抽取的主要类。

类拆分解耦的原因和目标

在编程过程中,高质量的代码需要具有可维护性、可读性和可扩展性,合理的利用设计模式是提高代码质量的关键,对于一个类的设计,单一职责原则是必须要充分考虑的设计模式中的一种原则,单一职责要求一个列只负责完成一个职责或者功能,不存在多余一种导致类变更的原因,单一职责原则通过避免设计大而全的类,避免将不相关的功能耦合在一起,来提高类的内聚性。同时,类职责单一,类依赖的被依赖的其他类也会变少,减少代码的耦合性,以此来实现代码的高内聚,低耦合。但是,如果拆分的过细,实际上会适得其反,反倒会降低内聚性,也会影响到代码的可维护性,因此在编程过程中需要掌握一个度,要求一个类应该有自己明确的边界责任,在kingbaseXLogicalExtractor类的开发过程中,随着需求的增加,尤其是KES版本迭代和兼容模式的更新,类逐渐扩展,当给KingbaseXLogicalExtractor类增加一个新的责任时,开发者会觉得一个小的责任不值得分离出一个单独的类进行处理,于是,随着责任的不断增加,这个类包含了大量的数据和函数,逻辑变的越来越复杂。

此时,可以依据高内聚低耦合的原则,如果某些数据和方法总是一起出现,或者某些数据经常同时变化,这就表明他们应该放在同一个类中,另一种信号是类的子类化方式,如果子类化只影响类的部分特性,或者类的特性需要以不同的方式来子类化,这就意味着类需要进行分解。在kingbaseXLogicalExtractor类中,V8R6和V8R3版本和Oracle、pg和mysql兼容模式下在抽取层面有不同的实现,因此需要为kingbaseXLogicalExtractor类生成子类,每个子类实现自己独有的功能,实现类的解耦。

拆分解耦方案

  • 继承结构设计

由于KES不同版本或者不同兼容模式在数据源端抽取上的实现逻辑存在不同,因此设计将KingbaseXLogicalExtractor类定义为父类,按照KES版本,定义两个子类KingbaseV8R3XLogicalExtractor和KingbaseV8R6XLogicalExtractor,按照兼容模式,定义六个兼容模式子类继承版本子类,分别为KingbaseV8R3OraXLogicalExtractor、KingbaseV8R3MysqlXLogicalExtractor、KingbaseV8R3PgXLogicalExtractor、KingbaseV8R6OraXLogicalExtractor、KingbaseV8R6MysqlXLogicalExtractor、KingbaseV8R6PgXLogicalExtractor。

  • 属性的修改与定义

由于版本和兼容模式判断的存在,KingbaseXLogicalExtractor类中包含大量的标志属性的变量,如表前缀属性:dbModePrefix、大小写敏感属性:caseSensitive,sql执行语句属性V8R6_FUNC_FOR_TRIGGER,这些属性可以根据子类的抽取下移至子类定义中,父类中只需要定义默认值即可。同时由于父类中存在诸多子类需要继承的属性,因此需要修改相关属性访问权限修饰符为protected。

  • 父类方法调整

父类方法调整主要包括方法的删除增加和重新定义,删除方法主要是通过判断数据库版本和兼容信息设置不同属性值,包括checkDatabaseMode()方法和checkESVsersion()方法;删除方法还包括checkV8r6EnableCi()、mergeR6InheritsTable()等根据不同版本执行不同逻辑的方法,这些方法只需要保留基本实现,需要在子类中重写。子类方法调整主要包括prepare()、extractEvent()、fillColSpecAndVal()等,这些方法内存在对版本和兼容性的判断,需要将公共逻辑抽取出来形成父类方法,在子类中单独实现子类独有的逻辑。此外,对于需要子类继承的方法,需要将访问权限控制为protected。

  • 子类方法重写

如前所述,在子类中需要重写的方法包括prepare(),extractEvent()、extractColumnMetaData()、fillColSpecAndVal()等,这些方法分别完成子类的属性设置,数据抽取和oneRowChange封装等逻辑,需要根据版本和兼容模式要求实现。

参考资料

KFS项目源代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值