一种用于数据库的写入互斥方法及装置技术领域
本申请涉及数据库领域,具体涉及一种用于数据库的写入互斥方法。本申
请同时提供一种用于数据库的写入互斥装置。
背景技术
MySQL是一个开放源码的关系型数据库管理系统,通常采用主从同步的架
构方式,即:一台主服务器负责处理写入操作和少量的读操作,一台或者多台
从服务器(或称备用服务器)负责处理读操作,从而实现负载均衡,缩短对用
户访问请求的响应时间。针对上述主从同步的架构方式,MySQL数据库系统
提供了采用二进制日志文件Binlog来实现主、从数据库之间的数据复制功能。
然而随着数据库技术以及数据库业务的发展,上述主从复制功能已无法满
足多变的用户需求,例如,有的数据库业务只需要将MySQL数据库中的部分库
或者表中的数据同步到目标MySQL数据库中;有的业务则需要把其他关系型数
据库,甚至nosql数据库中的数据同步到目的MySQL数据库中。基于这些需求,
出现了采用外部程序实现数据库之间数据同步的实现方式。
通过外部程序实现数据库之间的同步时,通常由一个进程负责两个数据库
的同步,即:从源数据库中读取数据,经过必要的处理后,再通过与目标数据
库之间建立的一条或者多条连接将数据写入目标数据库中。为了保障数据同步
过程的顺利执行,通常还会启动一个负责容灾的模块(简称容灾模块),该模块
通过侦听同步进程定期(例如每隔5秒或者10秒)发送的心跳数据包来监测同
步进程的工作状态,当容灾模块在预先设定的一段时间内(例如1分钟)没有
收到同步进程的心跳数据包,则认为同步进程出现故障,容灾模块会启动一个
新的同步进程来接管当前的数据同步过程,从而使得数据同步过程依然正常进
行。
上述实现方式,通常可以保证数据同步过程的顺利执行,然而在具体实现
中,可能出现容灾模块发生误判的情况,例如,因为网络连接故障(网线断开),
导致同步进程和容灾模块之间的网络通信被中断,容灾模块在预先设定的一段
时间内没有接收到同步进程的心跳数据包,容灾模块会因此启动新的同步进程,
在这种情况下,就会出现两个同步进程同时向同一个目标MySQL数据库写入数
据的问题,从而导致目标MySQL数据库中的数据错误。
发明内容
本申请提供一种用于数据库的写入互斥方法,以解决两个执行同一写入任
务的进程同时向目标数据库写入数据而导致数据错误的问题。本申请另外提供
一种用于数据库的写入互斥装置。
本申请提供一种用于数据库的写入互斥方法,所述方法在向同一个目标数
据库执行同一写入任务的进程中实施,包括:
采用为所述进程预先指定的统一的用户名创建用于向目标数据库写入数据
的连接,所述目标数据库为每个与其建立的连接分配唯一的连接标识;
获取已创建连接的连接标识,作为本地连接标识;
获取所述目标数据库中采用所述用户名的所有连接的连接标识列表;
判断所述连接标识列表中是否存在不同于所述本地连接标识的其他连接标
识;
若是,关闭已创建的连接;若否,使用已创建的连接向所述目标数据库写
入数据。
可选的,所述目标数据库为MySQL数据库。
可选的,所述采用为所述进程预先指定的统一的用户名创建用于向目标数
据库写入数据的连接,采用如下方式实现:
调用MySQLCAPI提供的mysql_connect()函数,并将该函数的用户名参
数的值设置为所述预先指定的统一的用户名。
可选的,所述获取所述目标数据库中采用所述用户名的所有连接的连接标
识列表,采用如下方式实现:
执行SQL语句从PROCESSLIST表中查询采用所述用户名的所有连接的连
接标识列表,所述PROCESSLIST表存储在目标MySQL数据库的
information_schema库中。
可选的,所述创建用于向目标数据库写入数据的连接是指,按照预先设定
的连接数目,依次创建用于向目标数据库写入数据的多条连接。
可选的,所述获取已创建连接的连接标识作为本地连接标识是指,依次获
取已创建的每条连接的连接标识,组成本地连接标识列表。
可选的,所述判断所述连接标识列表中是否存在不同于所述本地连接标识
的其他连接标识是指,判断是否存在满足下列条件的连接标识:该连接标识包
含在从所述目标数据库获取的连接标识列表中、但是未包含在本地连接标识列
表中。
可选的,当所述判断所述连接标识列表中是否存在不同于所述本地连接标
识的其他连接标识的输出为“否”时,在执行所述使用已创建的连接向所述目
标数据库写入数据的步骤之前,执行下述操作:
判断已创建的连接数目是否小于预先设定的连接数目;
若是,按照预先设定的连接数目,依次创建用于向目标数据库写入数据的
多条连接;相应的,所述使用已创建的连接向所述目标数据库写入数据是指,
使用已创建的多条连接向所述目标数据库写入数据。
相应的,本申请还提供一种用于数据库的写入互斥装置,所述装置部署在
向同一个目标数据库执行同一写入任务的设备中,包括:
连接创建单元,用于采用预先指定的统一的用户名创建用于向目标数据库
写入数据的连接,所述目标数据库为每个与其建立的连接分配唯一的连接标识;
本地标识获取单元,用于获取已创建连接的连接标识,作为本地连接标识;
标识列表获取单元,用于获取所述目标数据库中采用所述用户名的所有连
接的连接标识列表;
连接标识判断单元,用于判断所述连接标识列表中是否存在不同于所述本
地连接标识的其他连接标识;
连接关闭单元,用于当所述连接标识判断单元的输出为“是”时,关闭已
创建的连接;
数据写入单元,用于当所述连接标识判断单元的输出为“否”时,使用已
创建的连接向所述目标数据库写入数据。
可选的,所述目标数据库为MySQL数据库。
可选的,所述连接创建单元具体用于,调用MySQLCAPI提供的
mysql_connect()函数来创建向目标数据库写入数据的连接,并且在调用该函数
时将用户名参数的值设置为所述预先指定的统一的用户名。
可选的,所述标识列表获取单元具体用于,执行SQL语句从PROCESSLIST
表中查询采用所述用户名的所有连接的连接标识列表,所述PROCESSLIST表
存储在目标MySQL数据库的information_schema库中。
可选的,所述连接创建单元具体用于,按照预先设定的连接数目,依次创
建用于向目标数据库写入数据的多条连接。
可选的,所述本地标识获取单元具体用于,依次获取已创建的每条连接的
连接标识,组成本地连接标识列表。
可选的,所述连接标识判断单元具体用于,判断是否存在满足下列条件的
连接标识:该连接标识包含在从所述目标数据库获取的连接标识列表中、但是
未包含在本地连接标识列表中。
可选的,所述装置还包括:
连接数目判断单元,用于当所述连接标识判断单元的输出为“否”时,判
断已创建的连接数目是否小于预先设定的连接数目;
连接循环创建单元,用于当所述连接数目判断单元的输出为“是”时,按
照预先设定的连接数目,依次创建用于向目标数据库写入数据的多条连接;相
应的,所述数据写入单元具体用于,使用所述连接循环创建单元创建的多条连
接向所述目标数据库写入数据。
与现有技术相比,本申请具有以下优点:
本申请提供的一种用于数据库的写入互斥方法,采用预先指定的统一的用
户名创建用于向目标数据库执行写入操作的连接并获取对应的连接标识,然后
判断目标数据库中采用同一用户名的连接标识列表中是否存在不同于上述连接
标识的其他连接标识,若是,关闭已创建的连接;若否,使用已创建的连接向
所述目标数据库写入数据。采用上述方法,充分利用了目标数据库为每个连接
分配唯一标识的特性,通过对连接标识的校验,可以获知是否已经存在其他进
程创建的向目标数据库执行写入操作的连接,从而实现了互斥检测功能,避免
两个进程同时向目标数据库执行同样的写入操作,有效保证目标数据库中的数
据的正确性。
附图说明
图1是本申请的一种用于数据库的写入互斥方法的实施例的流程图;
图2是本申请的一种用于数据库的写入互斥装置的实施例的示意图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请
能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背
本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
在本申请中,分别提供了一种用于数据库的写入互斥方法、以及一种用于
数据库的写入互斥装置,在下面的实施例中逐一进行详细说明。
请参考图1,其为本申请的一种用于数据库的写入互斥方法的实施例的流程
图,所述方法包括如下步骤:
步骤101:采用预先指定的统一的用户名创建用于向目标数据库写入数据的
连接,所述目标数据库为每个与其建立的连接分配唯一的连接标识。
为了便于理解本申请的技术方案,先对MySQL数据库系统如何处理客户端
的连接请求作简要说明。MySQL服务器体系结构中,与连接建立过程相关的模
块主要有:连接管理器、线程管理器和连接线程,MySQL服务器启动时,先进
行初始化操作,随后连接管理器负责侦听来自客户端的连接建立请求,当有客
户端请求连接时,线程管理器会为之创建一个连接线程,由连接线程负责处理
该客户端后续的数据库操作请求。
通过上述处理过程,在MySQL数据库一侧,每一个连接线程都会有一个线
程标识(thread_id),而每一条连接通常与一个连接线程相对应,因此所述线程
标识也可以用于标识与该连接线程对应的连接,即为本申请所述的目标数据库
为该连接分配的连接标识(也称为sessionId)。该标识在MySQL数据库实例中
是从0开始的严格递增的整数,其取值范围为0~232-1,即使每秒钟创建一个连
接,该资源也需要136年用完,另外该标识在每次数据库重启(所有连接会中
断)后会归零重新计数,因此在实际应用中,可以认为该标识是MySQL数据库
连接的唯一标识,不同的数据库连接其标识是不同的。
本申请提供的用于数据库的写入互斥方法,就是利用了MySQL数据库为每
个与其建立的连接分配唯一连接标识的特性实现了互斥检测。具体说,向MySQL
数据库执行相同数据写入任务的进程都采用预先指定的统一的用户名与MySQL
数据库建立连接,通过对MySQL数据库上采用所述用户名的所有连接标识与本
进程所创建的连接标识的比对,可以判断出是否已经存在其他向MySQL数据库
执行相同写入任务的进程创建的连接,如果有,则关闭本进程创建的连接,不
执行后续的写入操作,从而避免两个进程同时向MySQL数据库执行同样的写入
操作。
上面以向MySQL数据库执行写入操作为背景,介绍了本申请技术方案的基
本原理。实际上,本申请技术方案所述的目标数据库,并不局限于MySQL数据
库,可以是能够为与其建立的连接分配唯一标识的其他数据库,例如:Oracle
数据库,即:只要是向具备上述特性的目标数据库执行同一写入任务的进程,
就都可以通过实施本申请提供的方法,实现对目标数据库的写入互斥。
本步骤中,采用预先指定的统一的用户名,创建用于向目标数据库写入数
据的连接。在本实施例的一个具体例子中,目标数据库是MySQL数据库,所述
预先指定的统一的用户名为:drc,因此在本步骤中采用如下方式调用MySQLC
API提供的mysql_connect()函数创建与MySQL数据库之间的连接:
link=mysql_connect('mysql_server','drc','mysql_password');
之所以要采用预先指定的统一的用户名创建连接,是为了将要进行互斥检
测的、向目标数据库执行相同写入任务的进程创建的连接与其它进程创建的连
接区分开,保证互斥检测的正确性。
步骤102:获取已创建连接的连接标识,作为本地连接标识。
在步骤101中已经创建了与目标数据库之间的连接,在本步骤中可以进一
步获取目标数据库为该连接分配的连接标识。
在本实施例的上述具体例子中,在步骤101采用mysql_connect()函数创建连
接,该函数返回的是一个类型为resource的连接资源标识,在本步骤中使用该连
接资源标识,采用如下方式调用MySQLCAPI提供的mysql_thread_id()函数获
取与该连接对应的连接标识:
conn_id=mysql_thread_id(link);
步骤103:获取所述目标数据库中采用所述用户名的所有连接的连接标识列
表。
通常情况下,目标数据库会记录与其建立的所有连接的相关信息,通过Shell
命令行或者是SQL的查询语句可以获取这部分信息。例如,通过showprocesslist;
命令可以查看MySQL数据库上正在运行的所有连接线程的相关信息,包括线程
标识(即:本申请所述的连接标识)、用户名、当前执行的操作以及所处的状态
等。
在本步骤中,要获取所述目标数据库中采用预先指定的用户名的所有连接
的连接标识列表,可以通过上述方式先获取所有连接线程的相关信息,然后从
中筛选出采用预先指定的用户名创建的连接线程,并提取其中的连接标识信息
就得到了本步骤所述的连接标识列表。
如果目标数据库将当前运行的连接线程的相关信息存储在表中,则可以使
用SQL语句查询所需的信息。在本实施例的上述具体例子中,目标MySQL数
据库将当前运行的连接线程的相关信息存储在information_schema库的
PROCESSLIST表中,因此可以使用在步骤101中创建的连接,采用如下所示的
代码向目标MySQL数据库查询采用drc用户名的所有连接的连接标识列表:
sql="select*frominformation_schema.PROCESSLISTwhereuser='drc'";
mysql_query(sql,link);
然后调用mysql_store_result()或者类似函数,获取目标MySQL数据库返回
的查询结果,即:采用drc用户名的所有连接线程的相关信息,从中提取线程标
识(也即连接标识),组成本步骤所述的连接标识列表。
步骤104:判断所述连接标识列表中是否存在不同于所述本地连接标识的其
他连接标识,若是,执行步骤105,否则执行步骤106。
由于本申请技术方案所述的目标数据库,具备为每个与其建立的连接分配
唯一标识的特性,因此,不同的进程所创建连接的连接标识必然是不同的,彼
此是能够相区分的。基于上述前提,向目标数据库执行写入任务的进程采用指
定的统一用户名创建连接后,如果从目标数据库获取的同用户名的连接标识列
表中只包含本地连接标识,没有其他连接标识,就说明不存在执行同一写入任
务的其他进程创建的连接,即不存在冲突,则可以转到步骤106执行数据写入
操作;相反地,如果从目标数据库获取的连接标识列表中除了包含本地连接标
识,还包含其他连接标识,则说明已经有其他执行同一写入任务的进程创建了
连接,这种情况下,转到步骤105执行,关闭本地已创建的连接,从而避免出
现两个进程同时向目标数据库执行相同的写入操作的情况。
步骤105:关闭已创建的连接。
由于在步骤104中检测到已经有其他进程创建了向目标数据库执行写入操
作的连接,本进程不能再向目标数据库执行相同的写入操作,因此执行关闭连
接的操作。在本实施例的上述具体例子中,采用MySQLCAPI提供的
mysql_close()函数关闭已经创建的连接,代码示例如下:
mysql_close(link);
至此,本进程已经检测到冲突(存在执行同一写入任务的在先进程创建的
连接),并且执行了关闭连接的操作。由此可见,采用本申请的技术方案,后启
动的进程不仅能够检测到写入冲突,而且可以通过关闭连接的方式解决该冲突,
从而保证任何时候只有一个进程向目标数据库执行写入操作。
在具体的实施中,本进程在执行了关闭连接的操作后可以退出,在必要的
时候由其他模块(例如容灾模块)再次启动实施了本申请技术方案的新进程;
或者本进程进入等待状态,等待其他模块通知其进入工作状态。不管采用何种
方式,重新启动或者重新进入工作状态的进程,依然要执行上述步骤进行互斥
检测。
步骤106:使用已创建的连接向所述目标数据库写入数据。
执行到本步骤,说明不存在与本进程同时向目标数据库执行写入操作的其
他进程,因此可以使用已创建的连接向所述目标数据库写入数据。在具体实现
中,为了向目标数据库写入数据,通常还需要执行相关的其他操作,例如,从
源数据库读取数据,进行相应的处理,然后将处理后的数据写入目标数据库的
数据库或表中。
此外,本步骤所述的写入操作,是相对宽泛的概念,是相对于数据库的读
操作而言的。本步骤所述的写入操作可以是将从源数据库读取的数据写入目标
数据库,也可以包括对目标数据库进行更改的其他操作,例如:插入行、删除
行、修改行中的某个字段等。在本实施例的一个具体例子中,通过读取源数据
库的binlog数据并进行解析、筛选等处理后,在目标数据库中执行相应的插入、
删除、修改等操作,这些操作通常都会改变目标数据库中的数据,都属于本申
请所述的写入操作。
为了提高向目标数据库写入数据的执行效率,本实施例的技术方案还提供
了一种采用多个连接并行向目标数据库执行写入操作的方式。具体说,当步骤
104的判断结果为“否”时,即:不存在不同于本地连接标识的其他连接标识,
此时判断已创建的连接数目是否小于预先设定的连接数目,若是,按照预先设
定的连接数目,依次创建用于向目标数据库写入数据的多条连接,然后使用已
创建的多条连接向所述目标数据库写入数据。
在本实施例的上述具体例子中,预先设定的连接数目为32,在此前的步骤
101中已经创建了1条连接,因此在本步骤中循环调用mysql_connect()函数依
次创建其余31条连接,随后由预先创建的32个线程分别使用其中的一条连接,
向目标数据库并发执行写入数据的操作,从而提高数据写入过程的效率。
采用上述创建多条连接的实施方式,由于不同进程的执行在时间上是彼此
独立的,导致在具体实施中可能存在这样一种比较极端的情况:在先启动的进
程在步骤101中创建的连接因为某种原因被意外关闭了(例如采用kill命令强制
该连接关闭),目标数据库不再存储与该连接相关的信息,并且该进程完成了互
斥检测,但是还没有开始创建其他的连接,此时恰好另外一个执行同一写入任
务的进程也启动了,由于在先进程的第一条连接被kill了,而后续连接尚未建立,
后启动进程没有检测到冲突,就会继续建立其他连接并且执行写入操作,而在
先进程由于已经完成了互斥检测,因此也会继续创建连接并开始执行写入操作,
这样就会出现两个进程同时向目标数据库执行相同写入操作的情况。
之所以会出现上面描述的情况,是因为在本步骤建立后续连接的过程中没
有进行互斥检测,因此为了避免上述情况的出现,可以采用这样的实施方式:
在本步骤106中每创建一条连接,都重复类似步骤101-步骤104的操作,检测
当前是否存在其他执行同一写入任务进程创建的连接,一旦检测到,就关闭本
进程所有已创建的连接,不执行向目标数据库写入数据的操作,从而同样可以
实现本申请的技术方案,避免在上述极端情况下出现两个进程同时向目标数据
库执行相同写入操作的情况。
上面通过步骤101-步骤106详细描述了本申请技术方案,在具体的应用中,
还可以采用另外一种实施方式:在步骤101中,按照预先设定的连接数目,采
用预先指定的统一的用户名依次创建用于向目标数据库写入数据的多条连接,
然后执行后续的步骤102-106,进行互斥检测并根据检测结果进行相应的操作。
其中在步骤102中,需要依次获取已创建的每条连接的连接标识,组成本地连
接标识列表,在步骤104中,则需要判断是否存在满足下列条件的连接标识:
该连接标识包含在从所述目标数据库获取的连接标识列表中、但是未包含在本
地连接标识列表中。
采用这种实施方式,代码的功能划分比较清晰,但是一旦检测到冲突,需
要将之前创建的多条连接依次关闭,存在对目标数据库连接资源的无谓占用,
而且额外的处理操作也会对性能造成影响。但是从技术实现的角度,这种实施
方式同样可以实现本申请的技术方案,避免两个执行同一写入任务的进程同时
向目标数据库写入数据。
上面描述了本申请技术方案的一些具体实施方式,在具体应用中,还可能
存在其他实施方式的变更,此处不一一列举,只要不偏离本申请技术方案的核
心(即:在执行写入操作之前,利用目标数据库为每个连接分配唯一标识这一
特性,检测是否存在其他执行同一写入任务的进程创建的连接,并且在不存在
的情况下,才能继续执行后续的写入操作),那么这些实施方式的变更就依然在
本申请的保护范围之内。
需要说明的是,在本实施例描述的具体例子中,所述目标数据库为MySQL
数据库,因此采用的是MySQLCAPI提供的相关函数实现的创建连接、获取连
接标识、获取指定用户名的连接标识列表、以及关闭连接等操作,相关的示例
代码也仅仅是示意性的。在其他实施过程中,根据目标数据库的不同,以及运
行平台的差异,可以采用不同于MySQLCAPI的其他接口,例如:SQL通用接
口或者JDBC接口等,对于这些依赖于实施的具体细节,本申请技术方案不做
具体的限定。
综上所述,本申请提供的一种用于数据库的写入互斥方法,充分利用了目
标数据库具有的为每个连接分配唯一标识的特性,通过对连接标识的校验,可
以获知是否已经存在其他进程创建的向目标数据库执行写入操作的连接,从而
实现了互斥检测功能,避免两个进程同时向目标数据库执行同样的写入操作,
有效保证目标数据库中的数据的正确性。
在上述的实施例中,提供了一种用于数据库的写入互斥方法,与之相对应
的,本申请还提供一种用于数据库的写入互斥装置。请参看图2,其为本申请的
一种用于数据库的写入互斥装置的实施例的示意图。由于装置实施例基本相似
于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即
可。下述描述的装置实施例仅仅是示意性的。
本实施例的一种用于数据库的写入互斥装置,所述装置部署在向同一个目
标数据库执行同一写入任务的设备中,包括:连接创建单元201,用于采用预先
指定的统一的用户名创建用于向目标数据库写入数据的连接,所述目标数据库
为每个与其建立的连接分配唯一的连接标识;本地标识获取单元202,用于获取
已创建连接的连接标识,作为本地连接标识;标识列表获取单元203,用于获取
所述目标数据库中采用所述用户名的所有连接的连接标识列表;连接标识判断
单元204,用于判断所述连接标识列表中是否存在不同于所述本地连接标识的其
他连接标识;连接关闭单元205,用于当所述连接标识判断单元的输出为“是”
时,关闭已创建的连接;数据写入单元206,用于当所述连接标识判断单元的输
出为“否”时,使用已创建的连接向所述目标数据库写入数据。
可选的,所述目标数据库为MySQL数据库。
可选的,所述连接创建单元具体用于,调用MySQLCAPI提供的
mysql_connect()函数来创建向目标数据库写入数据的连接,并且在调用该函数
时将用户名参数的值设置为所述预先指定的统一的用户名。
可选的,所述标识列表获取单元具体用于,执行SQL语句从PROCESSLIST
表中查询采用所述用户名的所有连接的连接标识列表,所述PROCESSLIST表
存储在目标MySQL数据库的information_schema库中。
可选的,所述连接创建单元具体用于,按照预先设定的连接数目,依次创
建用于向目标数据库写入数据的多条连接。
可选的,所述本地标识获取单元具体用于,依次获取已创建的每条连接的
连接标识,组成本地连接标识列表。
可选的,所述连接标识判断单元具体用于,判断是否存在满足下列条件的
连接标识:该连接标识包含在从所述目标数据库获取的连接标识列表中、但是
未包含在本地连接标识列表中。
可选的,所述装置还包括:
连接数目判断单元,用于当所述连接标识判断单元的输出为“否”时,判
断已创建的连接数目是否小于预先设定的连接数目;
连接循环创建单元,用于当所述连接数目判断单元的输出为“是”时,按
照预先设定的连接数目,依次创建用于向目标数据库写入数据的多条连接;相
应的,所述数据写入单元具体用于,使用所述连接循环创建单元创建的多条连
接向所述目标数据库写入数据。
本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本
领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,
因此本申请的保护范围应当以本申请权利要求所界定的范围为准。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出
接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器
(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flashRAM)。
内存是计算机可读介质的示例。
1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由
任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程
序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存
(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其
他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存
储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器
(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁
盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设
备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒
体(transitorymedia),如调制的数据信号和载波。
2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机
程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件
和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计
算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、
CD-ROM、光学存储器等)上实施的计算机程序产品的形式。