Web版ETL功能开发思考记录(数据抽取)(二)

        接上篇,一月来抽时间写了一些,首先该系统暂时预设不考虑元数据管控,不考虑数据库数据的单条管控,只进行不同类型库中的表级别数据的处理。上次记录到,基本每种数据库都有类似于数据泵一样的数据装载器的,这种装载器的装载效率远远高于INSERT INTO语句,能够使用这种方式最好,但是也应该提供INSERT INTO这种方式做选择。

        1.数据库,数据源。

        首先为了保证能实现多数量数据库,多种类数据库,所以数据库的IP,密码,账号全部存表,考虑到操作这个数据库的不一定都是管理员权限,所以库资源和具体的数据资源应该区分,设定两张表,一张表存数据库的IP,端口,种类,版本,一张表存对应数据库表下的数据资源,如账号,密码,服务名称等,这样来做到一个库表关联多个资源信息,可以支持一个库下,多个账号,多个资源表。

         2.支持JDBC连接时的版本不同导致的驱动包动态更换

         用过JDBC的同学应该都知道,JDBC在创建连接的时候,需要使用

Class.forName(driver);

          这种形式的代码来进行驱动的选择,例如像达梦数据库,需要在Class.forName();中填写“dm.jdbc.driver.DmDriver”来选择达梦数据库的驱动,但是这样就涉及到一个问题,像mysql数据库的连接。在mysql6.0以下的时候,连接驱动应该选择的是com.mysql.jdbc.Driver,但是在mysql6.0以上,需要选择com.mysql.cj.jdbc.Driver,如果选择错误,会连接不到或者报错,那么就需要一个动态的配置版本和驱动关联,处理完这个问题后,又有一个新问题,那就是URL,MYSQL版本高低都用的同学,可能会有一个记忆,那就是低版本貌似就是一个简单的IP+PORT+服务名称就能连接了,但是高版本的却还需要时区,连接模式等,举例:

jdbc:mysql://[ip]:[port]/[server]?useUnicode=true&characterEncoding=utf8  --低版本

jdbc:mysql://[ip]:[port]/[server]?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8   --高版本

所以为了尽量方便,我们在数据库中再加入URL模板的配置,将经常变动的类似IP,PORT,SERVER参数单独挑出来,作为可修改的参数,使用正则或者截取的方式来实现动态拼接,

         3.字段转换配置

         目前我个人所知的关系型常见数据库都有最少10种了,不说别的库,最常用的两个库,MYSQL和ORACLE之间,MYSQL表示整形数据用INT,但是在ORACLE中,都是使用NUMBER来表示数,那么就需要一个配置项,用于表述源表字段与目标表字段的对照转换关系

          4.流程设计

          针对以上思考,执行一次抽取,我们需要做的事情应该是:

  1. 配置数据库信息
  2. 配置对应数据库的数据源信息
  3. 配置数据转换关系表主表,选择源和目标的版本等
  4. 配置转换关系表明细表的字段对应关系
  5. 配置抽取任务,选择抽取源表和目标表,选择任务类型(1.直接向目标表执行SQL,2.设目标资源有表,执行数据转移,3.设目标资源无对应表,执行源目标表分析,目标资源建表,数据转移)
  6. 生成日志文件

猜你喜欢

转载自blog.csdn.net/Zachariahs/article/details/107740574