异构数据源之间的数据还原方法、装置和计算机设备与流程

文档序号:30079254发布日期:2022-05-18 04:00阅读:78来源:国知局
1.本发明涉及计算机
技术领域
:,具体涉及一种异构数据源之间的数据还原方法、一种异构数据源之间的数据还原装置和一种计算机设备。
背景技术
::2.目前绝大部分的实时采集工具仅仅只能通过采集日志,获取数据源操作日志即日志数据,发送到kafka等数据源中,做到日志的同步,但无法做到异构数据源之间的数据还原。3.比如mysql中执行updatetablesetc1=‘b’where‘c2’=2andc1=’a’目前相关技术中的binlog同步工具解析的数据为:c1字段before值(操作前的值)为a,after值(操作后的值)为b,c2字段before和after字段值是2,在sink端时只能将这种日志数据写入对应的表中,即向目标端(sink端)插入一条binlog日志的记录,记录某时某刻进行了一次update(更新)操作,操作前的值是什么,操作后的值是什么,而不能达到数据真正的异构数据源之间的还原。技术实现要素:4.本发明旨在至少在一定程度上解决上述技术中的技术问题之一。为此,本发明的第一个目在于提出一种异构数据源之间的数据还原方法,在source和sink的之间数据流中添加了flatmap算子,在flatmap算子对数据进行中间处理后进行数据还原的操作,有助于实现真正的数据还原。5.本发明的第二个目的在于提出一种异构数据源之间的数据还原装置。6.本发明的第三个目的在于提出一种计算机设备。7.为达到上述目的,本发明第一方面实施例提出了一种异构数据源之间的数据还原方法,包括:8.source端从数据源采集日志信息,基于所述日志信息得到数据还原框架内部的数据结构,并将所述数据结构传递给flatmap算子;9.flatmap算子将所述数据结构转化为cdc(changedatacapture,变更数据捕获)实时数据;10.所述flatmap算子对所述cdc实时数据进行中间处理,并将处理后的cdc实时数据发送至sink端;11.所述sink端消费所述处理后的cdc实时数据,以对所述sink端的数据进行还原。12.另外,根据本发明上述实施例提出的异构数据源之间的数据还原方法还可以具有如下附加的技术特征:13.根据本发明的一个实施例,source端从数据源采集日志信息,基于所述日志信息得到数据还原框架内部的数据结构,包括:14.根据数据源信息连到数据源;15.通过数据源的api(applicationprogramminginterface,应用程序编程接口)获取对应的日志信息;16.解析所述日志信息,以得到解析后的值;17.根据所述解析后的值进行封装,以得到数据还原框架内部的数据结构。18.根据本发明的一个实施例,所述flatmap算子对所述cdc实时数据进行中间处理,并将处理后的cdc实时数据发送至sink端,包括:19.确定所述cdc实时数据属于ddl(datadefinitionlanguage,数据定义语言)操作数据或者dml(datamanipulationlanguage,数据操作语言)操作数据;20.如果所述cdc实时数据属于所述ddl操作数据,则将所述ddl操作数据存储到中间存储介质中;21.如果所述cdc实时数据属于dml操作数据,则判断所述dml操作数据是否需要阻塞;22.如果所述dml操作数据需要阻塞,则将所述dml操作数据存储到中间存储介质中;23.获取所述dml操作数据的库名和表名;24.根据所述dml操作数据的库名和表名将所述dml操作数据划分给对应的任务队列;25.通过监控线程判断存储在所述中间存储介质的所述ddl操作数据对应的ddl语句是否已被执行;26.如果所述ddl语句已被执行,则将所述ddl操作数据删除;27.将所述dml操作数据发送至sink端。28.根据本发明的一个实施例,判断所述dml操作数据是否需要阻塞,包括:29.判断所述中间存储介质中的数据表对应的ddl处理是否未完成;30.判断所述中间存储介质中的数据表对应的dml处理是否未完成;31.在所述ddl处理未完成或者所述dml处理未完成时,确定所述cdc实时数据需要阻塞。32.根据本发明的一个实施例,通过监控线程判断存储在所述中间存储介质的所述ddl操作数据对应的ddl语句是否已被执行,包括:33.监控线程对存储在所述中间存储介质的所述ddl操作数据的状态进行监控,在监控到所述ddl操作数据的状态为已执行时,确定所述ddl操作数据对应的ddl语句已被执行,其中,所述ddl操作数据的状态是用户在所述sink端执行所述ddl操作数据对应的ddl语句后更新的。34.根据本发明的一个实施例,所述sink端消费所述处理后的cdc实时数据,以对所述sink端的数据进行还原,包括:35.判断当前任务是否已开启数据还原功能;36.如果当前任务未开启数据还原功能,则执行数据同步动作,以进行所述dml操作数据的写入;如果当前任务已开启数据还原功能,则确定所述dml操作数据的操作类型;37.调用所述操作类型对应的类型执行器执行还原动作。38.根据本发明的一个实施例,所述dml操作数据的操作类型,包括:插入、更新和删除,所述类型执行器包括删除执行器、更新执行器和插入执行器。39.为实现上述目的,本发明第二方面实施例提出了一种异构数据源之间的数据还原装置,包括:40.采集模块,用于从数据源采集日志信息,基于所述日志信息得到数据还原框架内部的数据结构;41.转化模块,用于通过flatmap算子将所述数据结构转化为cdc实时数据;42.处理模块,用于通过flatmap算子对所述cdc实时数据进行中间处理;43.还原模块,用于消费所述处理后的cdc实时数据,以对数据进行还原。44.为实现上述目的,本发明第三方面实施例提出了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现本发明第一方面实施例提出的异构数据源之间的数据还原方法。45.本发明的技术方案,在source和sink的之间数据流中添加了flatmap算子,在flatmap算子对数据进行中间处理后进行数据还原的操作,有助于实现真正的数据还原。附图说明46.图1为本发明实施例的异构数据源之间的数据还原方法的流程图。47.图2为本发明一个实施例的source端进行数据采集的示意图。48.图3为本发明一个实施例的flatmap算子进行中间处理的流程图。49.图4为本发明一个实施例的sink端进行数据还原的示意图。50.图5为本发明实施例的异构数据源之间的数据还原装置的方框示意图。具体实施方式51.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。52.图1为本发明实施例的异构数据源之间的数据还原方法的流程图。53.需要说明的是,异构数据源可以是指不同的数据库之间的数据,异构就是说数据来源和同步的目标端(sink端)不是同一种数据源类型,比如数据来源存储在mysql,实时同步会将mysql数据同步到oracle中,数据在mysql和oracle中流转,即2种不同数据源之间流转,称为异构数据源。54.异构数据源之间的数据还原是在一些场景,如同一个公司不同的部门之间数据进行打通,如a部门和b部门,b部门需要a部门的数据,但是b部门没有a部门的表的权限等,a部门使用实时同步方式可以将某些表数据信息同步到b部门。55.本发明实施例中的数据还原,可以理解为数据源(源端)与目标端(sink端)之间的数据与结构的同步,数据源和目标端都支持数据的同步。相关技术之中仅仅实现表数据同步,而本发明实施例中既能实现表数据同步,又能够实现表结构同步,即本发明实施例可以实现真正的数据还原。56.如图1所示,该方法包括以下步骤:57.s1,source端从数据源采集日志信息,基于日志信息得到数据还原框架内部的数据结构,并将数据结构传递给flatmap算子。58.其中,数据源具备支持实时同步的功能,在客户端进行ddl、dml等表结构、表数据发生了变化之后,能提供对应的api或sdk,以供source端获取到实时的数据信息。59.其中,source是指flink的一个算子,source端会连接到oracle、mysql等各种数据源,并读取数据传送至下游端。60.其中,数据还原框架,可以理解为基于flinkx(一个基于flink的数据同步框架)的框架,其在flinkx的基础上增加了本发明实施例的数据还原功能。61.具体地,source端可实时监听数据源源表的实时数据,然后同步到sink端,其中,在同步至sink端之前,需通过flatmap算子。source端根据数据源信息连接到数据源之后,通过数据源的接口获取对应的日志信息,之后,基于日志信息得到数据还原框架内部的数据结构,该数据结构为数据还原框架内部的一个流转结构,并将该数据结构发送给flatmap算子。62.其中,数据源信息是用户在使用数据还原框架中时配置的,比如配置数据来源是mysql还是oracle等等,这个数据源的ip地址、端口号、账号与密码的填写。63.s2,flatmap算子将数据结构转化为cdc实时数据。64.s3,flatmap算子对cdc实时数据进行中间处理,并将处理后的cdc实时数据发送至sink端。65.具体地,在source端将数据结构发送给flatmap算子后,flatmap算子接收数据结构,并将数据结构转换为cdc实时数据,作为后续处理数据结构。之后,对cdc实时数据进行中间处理,并将处理后的cdc实时数据发送至sink端(目标端)。66.s4,sink端消费处理后的cdc实时数据,以对sink端的数据进行还原。67.其中,“消费”可以是指同步数据成功。68.具体地,sink端在接收到处理后的cdc实时数据之后,消费cdc实时数据,以实现数据源与sink端之间的数据还原。69.举例而言,上游比如数据源mysql插入了一条数据,同步到sink端的oracle,即oracle也要插入一条数据。70.此处消费就是指sink端会插入一条数据,插入的数据值和mysql插入的数据值相同,即sink端在接收到mysql插入的数据之后,插入相同的数据到oracle,叫做sink端消费数据进行还原。71.需要说明的是,相较于相关技术中仅通过采集日志信息的方式进行数据同步,本发明实施例基于flink计算框架,在source和sink的之间数据流中加上flatmap算子,进行数据还原的操作,如dml的放行,监听目标端ddl执行完成等操作。72.本发明实施例的异构数据源之间的数据还原方法,在source和sink的之间数据流中添加了flatmap算子,进行数据还原的操作,有助于实现真正的数据还原。73.在本发明的一个实施例中,上述步骤s1中的,source端从数据源采集日志信息,基于日志信息得到数据还原框架内部的数据结构,可包括:根据数据源信息连到数据源;通过数据源的api获取对应的日志信息;解析日志信息,以得到解析后的值;根据解析后的值进行封装,以得到数据还原框架内部的数据结构。74.具体地,如图2所示,数据还原框架可根据数据源的协议,产生一个客户端(即sourceconnector)连接数据源进行实时数据的获取,source端根据数据源信息连到(connect)数据源之后,通过数据源的api获取源源不断地下载数据源对应的日志信息(即dumpredolog),之后,根据数据源文档(数据源厂商提供的,其中这个数据源的安装使用以及各个功能的原理或介绍)解析日志信息,即redolog数据,解析后获取到操作类型、数据来源和具体影响值。需要说明的是,一般来说数据分为2个大的操作类型:第一种是对结构的操作,叫做ddl比如表增加字段减少字段等,第二种是对数据的操作,叫做dml比如对某个数据更新,或者新增一条数据。如mysql的日志信息解析后可获取数据来源是哪个库、哪个表,数据的操作类型是具体哪种ddl如createtable或者哪种dml如insert(插入)、delete(删除)、update(更新)。75.之后,source端根据解析后的值封装为数据还原框架内部的数据结构,即将日志信息封装为内部一个对象存储,示例:76.{"schema":"xxx","table":"xx","operatetype":"update","before_id":"xx","after_id":"xxx","before_name":"xx","after_name":"xx","operatetime":"yyyy-mm-ddhh:mm:ss"},其中,schema表示表的组织,代表数据表属于哪个组织下,table为表名称,operatetype代表数据的操作类型,这里的update就代表更新操作,以“before_”开头的代表表中数据在更新前是什么值,其中下划线后的字段代表表的字段,即before_id表示更新前表的字段id,before_name表示更新前表的字段name,以“after_”开头的代表表中数据在更新后是什么值,其中下划线后的字段代表表的字段,即after_id表示更新后表的字段id,after_name表示更新后表的字段name,operatetime代表本次操作的时间,单位是yyyy-mm-ddhh:mm:ss格式的。77.封装之后,将封装后的数据向下游即flatmap算子传递。78.flatmap算子接收到封装数据之后,将封装数据转换为cdc实时数据(cdcdata),作为后续处理数据结构,之后进行中间处理。79.在本发明的一个实施例中,上述步骤s3,即flatmap算子对cdc实时数据进行中间处理,并将处理后的cdc实时数据发送至sink端,可包括:确定cdc实时数据属于ddl操作数据或者dml操作数据;如果cdc实时数据属于ddl操作数据,则将ddl操作数据存储到中间存储介质中;如果cdc实时数据属于dml操作数据,则判断dml操作数据是否需要阻塞;如果dml操作数据需要阻塞,则将dml操作数据存储到中间存储介质中;获取dml操作数据的库名和表名;根据dml操作数据的库名和表名将dml操作数据划分给对应的任务队列;通过监控线程判断存储在中间存储介质的ddl操作数据对应的ddl语句是否已被执行;如果ddl语句已被执行,则将ddl操作数据删除;将dml操作数据发送至sink端。80.其中,ddl操作数据,可以是指经过ddl操作的数据,ddl操作是指操作数据表结构;dml操作数据,可以是指经过dml操作的数据,dml操作是指对表中的数据进行增、删、改等。81.其中,阻塞可以理解为阻止cdc实时数据不放行,即将cdc实时数据不传递至对应的下游,即sink端(目标端)。82.进一步地,判断dml操作数据是否需要阻塞,可包括:判断中间存储介质中的数据表对应的ddl处理是否未完成;判断中间存储介质中的数据表对应的dml处理是否未完成;在ddl处理未完成或者dml数据未完成时,确定cdc实时数据需要阻塞。83.又进一步地,通过监控线程判断存储在中间存储介质的ddl操作数据对应的ddl语句是否已被执行,包括:监控线程对存储在中间存储介质的ddl操作数据的状态进行监控,在监控到ddl操作数据的状态为已执行时,确定ddl操作数据对应的ddl语句已被执行,其中,ddl操作数据的状态是用户在sink端执行ddl操作数据对应的ddl语句后更新的。84.具体而言,如图3所示,flatmap算子判断cdc实时数据是否属于ddl操作数据,如果是,则将cdc实时数据写入中间存储介质中持久化;如果否,则说明cdc实时数据属于dml操作数据,于是判断是否需要将cdc实时数据进行阻塞,阻塞的条件为:1)中间存储介质中存储的表(数据里的table字段的名称对应的表)是否有对应的ddl的处理没有完成;2)中间介质存储的此表对应的dml数据是否还没处理完如果满足上述的任意一个条件,即:中间存储介质的ddl库中存在ddl语句状态尚未变成done,和/或,中间存储介质中的dml库中存在flag位点比当前数据前的、尚未写出的dml语句,则此dml操作数据会被阻塞,将dml操作数据存储至中间存储介质中,而不会发送给sink端消费。85.之后,flatmap算子根据dml操作数据的来源即库的名称databas和表名table划分给对应的一个task进行执行,如发送给下游sink端进行处理或做其他业务操作。即:flatmap算子按照database.table换分为一个一个的任务进行执行,即a表用一个线程执行,b表用一个线程执行这种关系。86.flatmap算子划分好任务后,监控(monitor)线程判断存储在中间存储介质的ddl语句是否已被执行,主要是通过一个标志位进行判断。在存储ddl操作数据之后,客户/用户应手动在目标端(sink端)执行对应的ddl操作,在ddl操作执行完成之后,客户/用户再更新中间存储介质的ddl操作数据的状态,以更新为已执行状态,同时,monitor线程会监控此ddl操作数据的状态,在flatmap算子监控到这个状态为已执行后,flatmap算子会将此ddl操作数据删除,consumertask(消费任务)则会消费对应的dml发送到下游算子,即sink端。87.也就是说,ddl的执行交由客户在目标数据源端(sink端)执行,而不是框架中手动执行,主要涉及到异构数据源之间,ddl的映射关系是不同的,因此ddl语句只会阻塞后续dml数据的执行,具体ddl在目标端执行交由客户或相关人员进行手动操作。88.在解析到ddl语句时,传统的数据同步工具默认不解析直接丢弃,导致源表表结构和目标表表结构不一致,从而导致后续写入失败或者丢失部分数据。而本发明实施例可以使源表表结构和目标表结构一致,从而可避免后续写入失败或者丢失部分数据。89.在将dml操作数据发送至sink端之后,执行步骤s4,即:sink端消费dml操作数据,以对sink端的数据进行还原。90.sink端接收到dml数据之后,会判断数据是否是实时数据类型,如果是实时数据类型,则会继续判断对应的数据操作是哪种dml类型并进行对应的操作。91.在本发明的一个实施例中,上述步骤s4可包括:判断当前任务是否已开启数据还原功能;如果当前任务未开启数据还原功能,则执行数据同步动作,以进行dml操作数据的写入;如果当前任务已开启数据还原功能,则确定dml操作数据的操作类型;调用操作类型对应的类型执行器执行还原动作。92.其中,dml操作数据的操作类型,包括:插入(insert)、更新(update)和删除(delete),类型执行器包括删除执行器、更新执行器和插入执行器。93.具体而言,如图4所示,sink端接收到数据之后会判断当前任务是否已开启数据还原功能,如果没有开启数据还原功能,则是正常数据同步任务,则直接进行数据的写入,反之如果已开启数据还原功能,则会判断数据的操作类型是insert还是update,delete类型,交给对应的类型执行器执行操作,即:在操作类型包括插入(insert)时,选择插入执行器执行插入动作;在操作类型包括更新(update)时,选择更新执行器执行更新动作;在操作类型包括删除(delete)时,选择删除执行器执行删除动作,从而实现对应的数据还原。94.由此,本发明实施例在异构数据源之间,将源表的数据实时同步到目标端的一个相同表结构的表中,达到源表表结构和数据与目标表表结构和数据一样的目的,实现目标端真正的数据还原。95.相关技术在实时采集过程中一般只能将source端的日志信息发送到kafka中,后续其他业务再对日志数据解析进行操作,而本发明实施例相较于相关技术而言,可以实时的让数据在异构数据源之间直接进行数据还原,而不是仅仅获取日志数据。96.需要说明的是,可以在数据还原界面实现数据还原配置,首先,选择来源,其中,数据源类型为mysql,任务类型为binlog,数据源为gx_mysql,同步内容为数据和结构同步,表为source_student,采集起点:从任务运行时开始,数据操作:插入、更新和删除,从而实现数据还原的配置,之后选择目标,输入对应的数据源类型、数据源、行分隔符、列分隔符,以及高级配置,从而实现目标端的数据与结构同步。一般实时采集任务仅仅是同步dml语句,而数据与结构同步会消费到ddl语句,即mysql的表增加了一个字段,数据与结构同步会消费到这条消息并进行处理,而数据同步是不会消费到这条消息的。97.本发明实施例可以应用到袋鼠云数栈的数据开发套件中,通过在页面配置是否进行数据和结构同步,帮助业务团队快速进行异构数据源之间的数据还原。98.综上所述,本发明实施例的异构数据源之间的数据还原方法,基于flink在实时场景下进行异构数据源之间的数据还原,达到在源端更新数据或者进行ddl操作时,对应的目标端异构数据源能做到对应的数据还原,可以实现真正的数据还原。99.图5为本发明实施例的异构数据源之间的数据还原装置的方框示意图。100.如图5所示,该异构数据源之间的数据还原装置,包括:采集模块10、转化模块20、处理模块30和还原模块40。101.采集模块10,用于从数据源采集日志信息,基于日志信息得到数据还原框架内部的数据结构;转化模块20,用于通过flatmap算子将数据结构转化为cdc实时数据;处理模块30,用于通过flatmap算子对cdc实时数据进行中间处理;还原模块40,用于消费处理后的cdc实时数据,以对数据进行还原。102.需要说明的是,本发明实施例中异构数据源之间的数据还原装置的其他具体实施方式,可参见上述异构数据源之间的数据还原方法的具体实施方式,为避免冗余,此处不再赘述。103.该装置在flatmap算子对数据进行中间处理后进行数据还原的操作,有助于实现真正的数据还原。104.对应上述实施例,本发明还提出一种计算机设备。105.本发明实施例的计算机设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行该计算机程序时,可实现根据本发明上述实施例的异构数据源之间的数据还原方法。106.根据本发明实施例的计算机设备,处理器执行计算机程序时,source端从数据源采集日志信息,基于日志信息得到数据还原框架内部的数据结构,并将数据结构传递给flatmap算子;flatmap算子将数据结构转化为cdc实时数据;flatmap算子对cdc实时数据进行中间处理,并将处理后的cdc实时数据发送至sink端;sink端消费处理后的cdc实时数据,以对sink端的数据进行还原。由此,在source和sink的之间数据流中添加了flatmap算子,在flatmap算子对数据进行中间处理后进行数据还原的操作,有助于实现真正的数据还原。107.在本发明的描述中,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。“多个”的含义是两个或两个以上,除非另有明确具体的限定。108.在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。109.流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属
技术领域
:的技术人员所理解。110.在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,“计算机可读介质”可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(ram),只读存储器(rom),可擦除可编辑只读存储器(eprom或闪速存储器),光纤装置,以及便携式光盘只读存储器(cdrom)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。111.应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(pga),现场可编程门阵列(fpga)等。112.本
技术领域
:的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。113.此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。114.尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1