一种基于SQL的分布式数据统一访问系统及方法与流程

文档序号:19680500发布日期:2020-01-14 17:17阅读:184来源:国知局
一种基于SQL的分布式数据统一访问系统及方法与流程

本发明涉及银行支付系统改造技术领域,特别涉及一种基于sql的分布式数据统一访问的系统及方法。



背景技术:

pcip支付通道整合平台是某商业银行对接人民银行的“非银行支付机构网络支付清算平台”的系统,实现快捷支付、日终清算、网关支付、认证支付等功能。

pe系统作为某商业银行的支付总线系统,所有账务操作都经过pe系统处理,其系统的稳定性、性能、容量指标要求很高。

上述两个系统都具有做分布式改造的需求,扩展多个数据库,消除数据库访问的瓶颈,以提升系统的负载能力。由于这两个系统业务模块已相对稳定,考虑到修改可能带来的风险,因此需要设计一种对应用透明的分布式数据访问层,屏蔽业务模块需要考虑具体访问哪个数据库,避免业务模块的修改。

目前业界的分布式数据访问组件,其特点如下表:

目前业界的分布式数据访问组件无法同时满足以下预期:

1、实现方式是client-based。

2、c语言实现,与现有平台兼容。

3、与现有访问数据库的接口一致。

4、支持异构数据库。

5、支持使用sql访问关系型数据库和远端缓存。



技术实现要素:

本发明的目的就是克服现有技术的不足,提供了一种基于sql的分布式数据统一访问的系统及方法,该系统及方法具备以下功能:

1.支持访问各种类型的数据库(db2、mysql、oracle等)和远端缓存(redis)。业务模块不需要修改,可以无感知的访问数据库和远端缓存,仅需要做一些配置即可。

2.对于垂直拆分的数据库,可以根据sql语句中的表名无感知的切换数据库连接达到访问不同的数据库的目的。对于水平拆分的数据库,可以根据数据库水平拆分的规则无感知的切换数据库连接达到访问不同的数据库的目的。

3.具备使用sql语句访问远端缓存的能力。

4.具备扩展能力,扩展后方便存量数据的迁移和访问。

本发明采用如下技术方案:

一种基于sql的分布式数据统一访问系统,用于银行支付系统的数据连接,包括:

数据访问接口层,为应用程序提供统一的数据访问接口来访问不同类型的数据存储设备;

sql解析器,用于sql语法解析,从sql语句中抽取出表名、字段以及字段的值,形成语法树;

sql转换器,根据sql语法解析生成的语法树,构造redis访问命令;

执行组件,用于执行sql,返回执行结果记录集的记录;

odbc组件,应用程序通过所述odbc组件,能同时与多种数据库进行交互;

payhiredis客户端,payhiredis是在开源项目hiredis的基础上封装的一个redis数据库访问的c客户端,增加了对redis的主从模式的支持,能根据配置访问主服务器master或者从服务器slave,同时增加了自动重连机制;

连接管理器,用于执行数据库连接管理,管理所有数据存储的长连接以及执行连接切换。

进一步的,所述执行组件包括单笔执行组件和批量执行组件,所述单笔执行组件用于执行一次sql只返回执行结果记录集的一条记录;所述批量执行组件用于执行一次sql批量返回执行结果记录集的n条记录,n为大于1的整数。

进一步的,所述odbc组件采用开源项目unixodbc。

一种基于sql的分布式数据统一访问的方法,包括:

sql语法解析:根据关键词把sql语句划分为若干子句,并根据需要利用关键字对所述子句进行词法分析,从sql语句中抽取出表名、字段以及字段的值,形成语法树;根据抽取的表名访问数据库的系统表得到表的唯一索引、主键信息;对于复杂的解析不出来的sql语句,不再访问redis直接访问数据库;

数据源选择:根据所述sql语法解析中获得的表名,在配置文件中查看表的访问位置,确定所述访问位置在数据库或redis;优先访问redis;

redis访问:sqlconvertor根据sql语法分析生成的所述语法树,检查where条件是否满足主键或唯一索引要求,并构造redis访问命令;

数据库访问:通过使用odbc组件,应用程序能与多种类型的数据库进行交互;

数据库连接管理:为每一个数据库连接保留一份独立的连接上下文环境,在所述连接上下文环境中包含了连接数据库的基本信息,所述连接数据库的基本信息包括数据库配置名称、数据库驱动名称、dns、用户名、连接句柄;通过切换所述连接上下文环境完成数据库的切换。

进一步的,所述数据源选择,在配置文件中每个表配置一条记录,其中tbname为表名,dbname为数据库名,redisflag为redis服务器标识,“-1”表示该表不存在redis中;只要redisflag不为-1,就优先访问redis而不访问数据库;若redisflag为-1,则访问dbname指定的数据库。

进一步的,所述redis访问中,redis访问命令的构造规则包含插入、删除、更新和查询规则。

进一步的,设置payhiredis客户端,提供方便访问redis的接口;payhiredis是在开源项目hiredis的基础上封装的一个redis数据库访问的c客户端,payhiredis在hiredis的基础上,增加了对redis的主从模式的支持,能根据配置访问master或者slave,同时增加了自动重连机制。

进一步的,数据库访问时,同时提供单笔/批量操作数据库的接口,提高批量访问的效率。

进一步的,所述数据库连接管理,对于垂直拆分的数据库,根据sql语句中的表名切换数据库连接达到访问不同的数据库的目的;对于水平拆分的数据库,根据数据库水平拆分的规则切换数据库连接达到访问不同的数据库的目的。

进一步的,所述数据库连接管理,增加自动重连机制,遍历所有连接上下文环境,判断数据库连接是否正常,若异常则关闭数据库再重新连接。

本发明的有益效果为:数据访问层支持使用sql访问关系型数据库和远端缓存(redis);支持连接管理,业务模块无需关心;使用odbc组件支持多种关系型数据库的访问;提供了数据访问的批量执行接口等,能够满足支付系统分布式开发的所有需求。同时本发明还考虑到旧系统执行分布式改造过程中业务模块的变动可能带来风险,因此本发明的接口设计完全兼容旧系统,业务模块迁移可以很方便的迁移到分布式系统中。

通过生产验证发现,本发明设计的数据访问层满足了业务模块不变完成系统分布式改造的要求,而且整个系统迁移过程简单、可靠,可推广应用。

附图说明

图1所示为本发明实施例一种基于sql的分布式数据统一访问系统的整体架构图。

图2所示为实施例中sql语法解析生成的语法树示意图。

图3所示为payhiredis客户端封装后应用程序访问集群模式redis服务器的访问关系简化示意图。

图4所示为实施例中数据库连接管理示意图。

图5所示为实施例中数据源选择语句。

图6所示为实施例中sql生成redis插入命令的规则处理语句。

图7所示为实施例中sql生成redis删除命令的规则处理语句。

图8所示为实施例中sql生成redis更新命令的规则处理语句。

图9所示为实施例中sql生成redis查询命令的规则处理语句。

具体实施方式

下文将结合具体附图详细描述本发明具体实施例。应当注意的是,下述实施例中描述的技术特征或者技术特征的组合不应当被认为是孤立的,它们可以被相互组合从而达到更好的技术效果。

如图1所示,本发明实施例一种基于sql的分布式数据统一访问系统,包括:

数据访问接口层,为应用程序提供统一的数据访问接口来访问不同类型的数据存储设备,该数据访问接口层的接口与改造前系统接口保持一致;

sql解析器,用于sql语法解析,从sql语句中抽取出表名、字段以及字段的值等相关信息,形成语法树;

sql转换器,根据sql语法解析生成的语法树,构造远端缓存redis访问命令;

单笔执行组件:单次执行sql的组件,执行一次只返回执行结果记录集的一条记录;

批量执行组件:批量执行sql的组件,执行一次返回批量的记录集的n条记录;

odbc组件,采用源项目unixodbc,应用程序通过所述odbc组件,使用相同的源代码与多种数据库进行交互;

payhiredis客户端:payhiredis是在开源项目hiredis的基础上封装的一个redis数据库访问的c客户端,payhiredis在hiredis的基础上,增加了对redis的主从模式的支持,可根据配置访问master或者slave,同时增加了自动重连机制;

连接管理器,用于执行数据库连接管理,管理所有数据存储的长连接以及执行连接切换。

本发明实施例一种基于sql的分布式数据统一访问的方法,包括:

a)sql语法解析

为了降低复杂性、提高效率,sql解析器并未使用flex和bison这些工具,而是采用了词法分析和语法分析。sql解析器的词法分析是根据关键词把sql语句划分为几个子句;例如sql语句selectuser,scorefromuserinfowhereid<10andsubject=’math’,在分析只有会被划分成selectuser,score子句、fromuserinfo子句和whereid<10andsubject=’math’子句。然后根据需要对子句进行近一步的词法分析。根据关键字(from\where\and等)把输入转化成单个的token。其中token中包含keyword(也称symbol)和非keyword。例如,sql子句whereid<10andsubject=’math’在分析之后,会得到4个token,其中有2个keyword,分别为where和and,两个非keyword分别是id<10和subject=’math’。sql语句生成语法树如图2所示。可以从中抽取出表名、字段以及字段的值等相关信息。然后再根据抽取出来的表名访问数据库的系统表得到表的唯一索引、主键等信息。对于复杂的解析不出来的sql语句,不再访问远端缓存直接访问数据库。

b)数据源选择

数据源的选择可以根据sql解析中获得的表名,在配置文件tbconf.xml中查看表的访问位置,是在数据库还是远端缓存。在tbconf.xml中每个表配置一条记录,其中tbname为表名,dbname为数据库名,redisflag为redis服务器标识,“-1”表示该表不存在远端缓存(redis)中。如图3所示。只要redisflag不为-1,就优先访问远端缓存而不访问数据库;若redisflag为-1,则访问dbname指定的数据库,如图5所示。

c)远端缓存redis访问

为了同时支持sql语句访问关系型数据库和远端缓存(redis),因此设计了sql转换层,sql转换层根据sql语法分析生成的语法树,检查where条件是否满足主键或唯一索引要求,并构造远端缓存(redis)访问命令。基本的构造规则包含插入、删除、更新、查询规则。

优选的,sql生成redis插入命令的规则处理如图6所示。

sql生成redis删除命令的规则处理如图7所示。

sql生成redis更新命令的规则处理如图8所示。

sql生成redis查询命令的规则处理如图9所示。

payhiredis客户端层提供了方便访问redis的接口。payhiredis客户端封装后应用应用程序访问集群模式redis服务器的访问关系得到了简化,见图3所示。客户端中每次连接主服务器前给redis-sentinel发送“sentinelget-master-addr-by-namemymaster”命令获取主服务器的ip地址和端口,然后再连接到主服务器。每次连接从服务器前给redis-sentinel发送“sentinelslavesmymaster”命令获取从服务器的ip地址和端口列表,在列表中选择一个本地值,然后连接到从服务器。这些操作都封装在payhiredis的客户端中,使得集群模式对客户端透明,访问者认为只存在一台主机。payhiredisclient访问redis服务器时针对每一条命令都增加了自动重试,socket超时以及redis服务器异常等都会触发自动重试。每次自动重试都要首先进行主从选择,然后根据选择结果重连redis服务器,最后再重试上一条失败的redis命令。

d)数据库访问

通过使用odbc,应用程序能够使用相同的源代码和各种各样的数据库进行交互。这使得开发者不需要以特殊的数据库管理系统dbms为目标,或者了解不同支撑背景的数据库的详细细节,就能够开发和发布客户/服务器应用程序。同时提供了批量操作数据库的接口,提高批量访问的效率。

e)数据库连接管理

应用执行分布式改造后,必然要进行数据拆分,数据拆分后数据库增加,就需要对数据库的连接进行管理。hdbccontex中为每一个数据库连接保留一份独立的连接上下文环境,在上下文环境中包含了连接数据库的基本信息,包括数据库配置名称、数据库驱动名称、dns、用户名、连接句柄等。可以通过切换连接上下文环境完成数据库的切换。如图4所示,进程p1创建了ctx1、ctx2…ctxn共n个连接上下文环境hdbccontexctx[n],每个连接上下文环境连接一个数据库(db1、db2…dbn),进程p1通过在n个连接上下文环境中切换来访问n个数据库。

自动切连接,垂直拆分的数据库,可以根据sql语句中的表名无感知的切换数据库连接达到访问不同的数据库的目的。对于水平拆分的数据库,可以根据数据库水平拆分的规则无感知的切换数据库连接达到访问不同的数据库的目的。

自动重连,遍历所有连接上下文环境hdbccontexctx[n],判断数据库连接是否正常,异常则关闭数据库再重新连接。重连流程为:

1)保留当前使用的连接上下文环境hdbccontexctx[i],current=i;

2)遍历所有的连接上下文环境hdbccontexctx[0…n-1];

3)执行dbcommit操作,若dbcommit执行正常则表示当前连接上下文正常,跳转到步骤2继续执行;若dbcommit执行异常则表示当前连接上下文异常,跳转到步骤4继续执行;

4)执行dbclose关闭当前连接上下文,执行dbopen重新打开数据库并保存到当前的连接上下文中;

5)执行i++,若i<n则跳转到步骤2继续遍历下一个连接上下文,否则继续执行步骤6;

6)恢复步骤1中保留的上下文环境hdbccontexctx[current]。

通过实际验证,本发明设计的数据访问层满足了业务模块不变完成系统分布式改造的要求,而且整个系统迁移过程简单、可靠,达到了预期目标。

本文虽然已经给出了本发明的几个实施例,但是本领域的技术人员应当理解,在不脱离本发明精神的情况下,可以对本文的实施例进行改变。上述实施例只是示例性的,不应以本文的实施例作为本发明权利范围的限定。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1