一种在分布式系统中执行sql脚本文件的方法和装置的制作方法

文档序号:6611467阅读:121来源:国知局
专利名称:一种在分布式系统中执行sql脚本文件的方法和装置的制作方法
技术领域
本发明涉及数据联机处理领域,特别是涉及一种在分布式系统中执行SQL脚本文件的方法和装置。
背景技术
自计算机问世以来,就开始存放数据,数据的存储组织管理就成了计算机所需解决的最基本的问题之一。最初的数据,各自为战,以文件形式存放,不同的应用、不同的文件而相同的数据造成了资源与人力的浪费。随着计算机存储数据的日益增多,数据重复的问题越来越突出,于是人们就想到将数据集中存储、统一管理,这样就演变成数据库管理系统而形成数据库技术。数据库技术的研究和发展已成为现代信息化社会具有强大生命力的一个重要领域。目前的大多数数据库系统中,SQL(Structured Query Language结构化查询语言)脚本的应用非常广泛,SQL脚本一般就是一种依据SQL格式编写的“.sql”文件,SQL脚本通常可以由SQL查询分析器来执行。
现有技术中大多数的数据库系统都运行在分布式系统中,即数据库存放在服务器端,用户可以通过客户端查询和编辑服务器端的数据库信息,该过程就涉及到SQL脚本文件的执行。再例如,当新增或修改模块的功能时,有时候需要对后台数据库的结构或数据表中的数据进行增加或修改,这时需要用动态的SQL脚本文件去实现以符合新增或修改模块功能时的要求。尤其是,当一个子系统要修改或新增的功能比较多时,可能相应的SQL脚本命令也会很多,这时候对应的SQL脚本文件也会很大。
现有技术中,一般的,执行SQL脚本文件都是采用一次全部读取一个文件中的所有的SQL脚本放到内存中,然后把内存中的数据发送给SQL服务器进行执行。对于一般的小的SQL脚本文件而言,该过程基本上没有很大问题,但是对于比较大的SQL脚本文件则存在较大的问题,主要表现为内存资源和公共资源的过度占用,进而导致服务器端的性能降低。另外,由于客户端一直在等待SQL服务器端的执行返回,而服务器端的执行耗时又较长,则导致客户端占用的内存一直不能释放,一直处于挂机的状态,给客户端其他的一些操作带来严重的影响。
总之,需要本领域技术人员迫切解决的一个技术问题就是如何降低大数据量SQL脚本文件在分布式系统中执行时的资源过度占用。

发明内容
本发明所要解决的技术问题是提供一种在分布式系统中执行SQL脚本文件的方法和装置,能够将大数据量的SQL脚本文件分块发送和执行,减少对客户端和服务器端资源的占用,提高执行效率。
为了解决上述问题,本发明公开了一种在分布式系统中执行SQL脚本文件的方法,具体包括客户端启动第一线程和第二线程;所述第一线程和第二线程并行运行;所述第一线程用于将SQL脚本文件切分成多个脚本块以及依次将各个脚本块放入预置的缓冲区;如果预置缓冲区已满,则暂停第一线程,等到预置缓冲区拥有空间时再继续执行第一线程;所述第二线程用于完成以下步骤依序读取所述缓冲区中的一个脚本块,并释放相应存储空间;传送该脚本块内容至服务器端;接收到服务器端的执行返回信息后,依序读取所述缓冲区中的下一个脚本块,重复前述步骤,直至该SQL脚本文件执行完毕。
优选的,对SQL脚本文件依照执行顺序,按照行数进行切分。
优选的,可以采用先进先出的方式,将各个脚本块形成队列放入所述缓冲区中;或者,也可以针对各个脚本块进行顺序编号后放入所述缓冲区中。
优选的,第一线程通过以下步骤获知所述缓冲区是否拥有空间第二线程释放所述缓冲区中的相应存储空间后,通知第一线程;或者,第一线程周期性的检测所述缓冲区的存储空间的变化。
进一步,所述的方法还可以包括第二线程读取所述缓冲区中的脚本块内容时,如果缓冲区为空,则等待。
依据本发明的另一实施例,公开了一种在分布式系统中执行SQL脚本文件的装置,该装置位于客户端,具体包括第一模块,用于将SQL脚本文件切分成多个脚本块以及依次将各个脚本块放入预置的缓冲区;如果预置缓冲区已满,则暂停该模块的执行,等到预置缓冲区拥有空间时再继续运行该模块;以及,包括读取子模块和通信子模块的第二模块,所述读取子模块用于依序读取所述缓冲区中的一个脚本块,并释放相应存储空间;所述通信子模块用于传送该脚本块内容至服务器端,以及接收到服务器端的执行返回信息;当所述通信子模块接收到服务器端的执行返回信息后,通知所述读取子模块依序读取所述缓冲区中的下一个脚本块;上述两个子模块重复运行,直至该SQL脚本文件执行完毕;所述第一模块和第二模块并行运行。
优选的,对SQL脚本文件依照执行顺序,按照行数进行切分。
优选的,可以采用先进先出的方式,将各个脚本块形成队列放入所述缓冲区中;或者,也可以针对各个脚本块进行顺序编号后放入所述缓冲区中。
优选的,所述的装置还可以包括位于第二模块中的通知子模块,用于当第二模块释放所述缓冲区中的相应存储空间后,通知第一模块所述缓冲区已释放空间;或者,位于第一模块中的检测子模块,用于周期性的检测所述缓冲区的存储空间的变化,以获知所述缓冲区是否拥有空间。
优选的,当所述读取子模块读取所述缓冲区中的脚本块内容时,如果缓冲区为空,则等待。
与现有技术相比,本发明具有以下优点由于本发明对于待执行的SQL脚本文件采用分块缓存的方式进行操作,不需要将该SQL脚本文件的数据一次性全部取出,所以能够节约客户端的内存空间,而用来存放各个脚本块的缓冲区可以由用户根据客户端计算性能进行分配即可,一般都属于可接受的范围,不会过度占用客户端的内存资源。
其次,由于分块读取、分块执行,各个脚本块的执行不会占用服务器过多的内存资源和公共资源,不会产生阻塞现象,所以对服务器性能的影响降到最低。
再者,由于在服务器端执行完一个脚本块后,第二线程回到客户端就可以直接读取内存缓冲区中的下一个脚本块,从而可以大大较少输入输出(I/O)操作的交互成本,提高执行效率。
总之,本发明创建的第一线程和第二线程,并行运行并且相互配合,提高负载均衡度,可以低内存的、快速高效的完成一个大文件的SQL脚本执行的任务,把文件执行中的压力平均分担到各个数据处理点,充分利用各部分的资源,从而大大提高整体的效率。


图1是本发明一种在分布式系统中执行SQL脚本文件的方法实施例的步骤流程图;图2是本发明一种在分布式系统中执行SQL脚本文件的装置实施例的结构框图。
具体实施例方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式
对本发明作进一步详细的说明。
首先,发明人针对现有技术进行了深入的分析,如下(1)、客户端由于要临时存储读取出来的SQL脚本文件,由于文件比较大,所以需要申请很大的内存用来保存文件;造成客户端内存资源的过度占用,影响客户端的其他数据处理过程。
(2)、由于SQL脚本文件数据量较大,所以很可能会导致SQL服务器端出现阻塞状况,严重时会影响SQL服务器的各方面的性能。首先,如果SQL服务器处理的脚本越多,占用的内存也会相应增加很多;并且,服务端在执行大批量的SQL脚本的同时会产生大量的日志文件以记录其操作等各个状态信息,由于执行的SQL脚本文件非常大所以产生的日志文件也是很大的,所以会过度占用服务器端的内存资源。其次,由于需要在执行SQL脚本的同时记录日志,则务必需要进行大量的输入和输出的操作,该过程会严重导致服务器端性能的降低。再者,由于SQL脚本文件数据量较大,服务器端针对该SQL脚本文件建立的事务中所关联的表和一些公共的资源就会很多,该事务没有执行完毕,则其所占用的资源就无法被释放,很大程度上会影响服务器端其他数据处理过程对资源的调用,从而产生堵塞。
针对上述发明人对现有技术的技术问题存在原因的分析,提出了以下的多个实施例,来解决资源被过度占用的问题。
本发明所提出的实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本发明,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
参照图1,示出了本发明一种在分布式系统中执行SQL脚本文件的方法实施例,具体可以包括以下步骤步骤101、客户端启动第一线程和第二线程;所述第一线程和第二线程并行运行。
本发明主要针对数据量较大的SQL脚本文件的执行过程的改善,有些ERP(Enterprise Resources Planning,企业资源规划)中需要执行10M左右的SQL脚本文件,而如此巨大的脚本文件在SQL查询分析器中是无法执行的,以传统的方式用程序打开执行大概需要30分钟,而且客户端程序一直处于挂起的状态,不能进行其他的操作,很大程度上影响了用户的使用。而采用本发明分块缓存、读取和执行的处理方式后,执行同样一个脚本文件,速度提高了很多倍,只需要15秒左右就可以完成,当然,程序执行完成以后的结果是一样的。
对于具体数据量达到多少的SQL脚本文件需要采用本发明,在此并不需要加以限定,因为随着客户端和服务器端硬件资源的不同,需求会有所不同。在实际中可以由计算机自行判断是否需要采用本发明的流程执行SQL脚本文件,当然,也可以由技术人员手动触发即可。得到触发信息后,客户端就会创建并启动第一线程和第二线程。
步骤102、所述第一线程用于将SQL脚本文件切分成多个脚本块以及依次将各个脚本块放入预置的缓冲区;如果预置缓冲区已满,则暂停第一线程,等到预置缓冲区拥有空间时再继续执行第一线程。优选的,可以由第一线程周期性的检测所述缓冲区的存储空间的变化,从而获知何时所述缓冲区拥有了闲置的空间,以继续执行第一线程,直到将该SQL脚本文件的所有内容都存放至所述缓冲区中。
所述缓冲区可以由计算机自身或者用户根据需要进行设定,例如,依据该SQL脚本文件的具体大小和客户端硬件资源的情况进行设定。
在本发明的一个实施例中,步骤102可以划分为切分子步骤和存放子步骤。对于切分子步骤和存放子步骤之间的关系,可以为先将该SQL脚本文件切分完毕,再执行存放子步骤,如果所述缓冲区已满,则暂停存放子步骤。当然,切分子步骤和存放子步骤之间的关系,也可以为先将该SQL脚本文件切分得到一个脚本块,然后将该脚本块存放至缓冲区,再对该SQL脚本文件切分得到下一个脚本块,如果所述缓冲区已满,则暂停切分子步骤。
那么具体该如何针对该SQL脚本文件进行切分呢?实际上,只要不影响脚本执行的任何切分方式都是可行的,例如,按照逻辑模块的角度进行切分;或者,按照脚本中的某些特定标记符进行切分等等。在本发明的一个优选实施例中,采用对SQL脚本文件依照执行顺序,按照行数进行切分;这是一个比较简单的切分方式,并且一般不会影响执行。至于具体应该按照多少行进行切分,则如同前述,需要依据该SQL脚本文件的具体占用资源的情况和客户端、服务器端硬件资源的情况进行确定,在此无法给出一确数。
进一步,为了保证脚本的正确执行,要求第二线程发送到服务器端进行执行的脚本块必须与在原SQL脚本文件中的顺序相同,在本发明的一个实施例中,可以采用以下的两种方式中的任一,例如,采用先进先出的方式,将各个脚本块形成队列放入所述缓冲区中,则第二线程读取时也按照队列的顺序读取,不会打乱脚本块的顺序;或者,第一线程针对各个脚本块进行顺序编号后放入所述缓冲区中。
步骤103、所述第二线程用于完成以下步骤依序读取所述缓冲区中的一个块,并释放相应存储空间;传送该块内容至服务器端;接收到服务器端的执行返回信息后,依序读取所述缓冲区中的下一个块,重复前述步骤,直至该SQL脚本文件执行完毕。
所述执行返回信息一般可以为服务器端的执行完毕回馈信息。所述第二线程可以依据缓冲区中的队列顺序或者依照编号顺序对缓冲区中的各个脚本块进行读取。
在本发明的另一优选实施例中,第二线程释放所述缓冲区中的相应存储空间后,通知第一线程,以便于第一线程及时获知所述缓冲区是否拥有闲置的空间。第二线程每读取一个脚本块,就释放所述缓冲区中的一个脚本块的内存,从而第一线程可以继续切分和存放,如此不断的循环,即可完成该SQL脚本文件的读取和执行。
进一步,在某些情况下,当第二线程读取所述缓冲区中的块内容时,可能会存在缓冲区为空的情况,例如,客户端的第一线程的切分和存放进度大大慢于服务器端的执行进度等等,则此时可以将第二线程挂起,执行等待操作。等到第一线程向所述缓冲区中存放了脚本块之后,再继续执行第二线程。
当第一线程切分并存放完该SQL脚本文件的所有块,以及第二线程传送了所述缓冲区内的所有脚本块之后,整个SQL脚本文件的执行任务就完成了,任务完成后就可以销毁第一线程和第二线程了。当然,也可以第一线程结束时,先销毁第一线程,等第二线程结束后,再销毁第二线程。
由于当缓冲区为空时,第二线程并不知悉原因是第一线程已经操作完毕,还是由于速度太慢导致,因此,优选的,当第一线程操作完毕时,通知第二线程,此时,当缓冲区为空,则等待服务器端执行完当前脚本块之后,就可以结束整个流程了。当然,第二线程一遇到缓冲区为空,就挂起等待,如果等待时间超时,则认为该SQL脚本文件已执行完毕,则结束整个流程。
对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。例如,步骤102和103实际上是同时进行的。
参照图2,一种在分布式系统中执行SQL脚本文件的装置,该装置位于客户端200,其特征在于,包括第一模块201和第二模块202;所述第一模块201和第二模块202并行运行。
所述第一模块201,用于将SQL脚本文件切分成多个块以及依次将各个块放入预置的缓冲区;如果预置缓冲区已满,则暂停该模块的执行,等到预置缓冲区拥有空间时再继续运行该模块;优选的,对SQL脚本文件依照执行顺序,按照行数进行切分。进一步,为了保证执行顺序,可以采用先进先出的方式,将各个块形成队列放入所述缓冲区中;或者,针对各个块进行顺序编号后放入所述缓冲区中。
所述第二模块202,包括读取子模块2021和通信子模块2022,所述读取子模块2021用于依序读取所述缓冲区中的一个块,并释放相应存储空间;所述通信子模块2022用于传送该块内容至服务器端300,以及接收到服务器端300的执行返回信息;当所述通信子模块2022接收到服务器端300的执行返回信息后,通知所述读取子模块2021依序读取所述缓冲区中的下一个块;上述两个子模块重复运行,直至该SQL脚本文件执行完毕。优选的,当所述读取子模块读取所述缓冲区中的块内容时,如果缓冲区为空,则等待。如果等待超时,或者收到第一模块执行完毕的通知,则等服务器端执行完当前脚本块之后,就可以结束整个装置的操作了。
优选的,为了便于第一模块及时知悉所述缓冲区释放拥有闲置空间,位于第二模块中的通知子模块,除了完成上述功能,还可以用于当第二模块释放所述缓冲区中的相应存储空间后,通知第一模块所述缓冲区已释放空间。或者,本装置实施例还可以包括位于第一模块中的检测子模块,用于周期性的检测所述缓冲区的存储空间的变化,以获知所述缓冲区是否拥有空间。
具体而言,第一模块把大文件SQL脚本分块成小块的脚本并放入用户定义的缓冲区中,如果用户自定义的缓冲区已被占满则暂时停止对大文件SQL脚本的分块工作,等到缓冲区释放空间后继续往其中放入分块的脚本内容。如此循环直至全部完成对SQL脚本的分块。第二模块从缓冲区中读取分块的SQL脚本,读取一个分块内容后则释放缓冲区的一个空间,把读取的分块内容并发送到SQL Server服务器端执行,等待执行完成返回后继续读取缓冲区的下一分块SQL脚本并发送到SQL Server服务器端。如此循环,如缓冲区的内容为空则等待,直到分拆完成整个文件的脚本,并且把缓冲区的内容全部都发送到SQL Server服务器端执行完成。
以上两个模块分工协作,即独立又有联系。第一模块只管分拆文件为小分块的内容并放入缓冲区,第二模块则只从缓冲区读取内容发送到服务器。两个模块通过公共的缓冲区进行联系。通过上面两个模块可以很好的平衡客户端和服务器端的资源压力,从而在性能和效率上得到很大的提升。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
以上对本发明所提供的一种在分布式系统中执行SQL脚本文件的方法和装置,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式
及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
权利要求
1.一种在分布式系统中执行SQL脚本文件的方法,其特征在于,包括客户端启动第一线程和第二线程;所述第一线程和第二线程并行运行;所述第一线程用于将SQL脚本文件切分成多个脚本块以及依次将各个脚本块放入预置的缓冲区;如果预置缓冲区已满,则暂停第一线程,等到预置缓冲区拥有空间时再继续执行第一线程;所述第二线程用于完成以下步骤依序读取所述缓冲区中的一个脚本块,并释放相应存储空间;传送该脚本块内容至服务器端;接收到服务器端的执行返回信息后,依序读取所述缓冲区中的下一个脚本块,重复前述步骤,直至该SQL脚本文件执行完毕。
2.如权利要求1所述的方法,其特征在于,对SQL脚本文件依照执行顺序,按照行数进行切分。
3.如权利要求1所述的方法,其特征在于,采用先进先出的方式,将各个脚本块形成队列放入所述缓冲区中;或者,针对各个脚本块进行顺序编号后放入所述缓冲区中。
4.如权利要求1所述的方法,其特征在于,第一线程通过以下步骤获知所述缓冲区是否拥有空间第二线程释放所述缓冲区中的相应存储空间后,通知第一线程;或者,第一线程周期性的检测所述缓冲区的存储空间的变化。
5.如权利要求1所述的方法,其特征在于,还包括,第二线程读取所述缓冲区中的脚本块内容时,如果缓冲区为空,则等待。
6.一种在分布式系统中执行SQL脚本文件的装置,该装置位于客户端,其特征在于,包括第一模块,用于将SQL脚本文件切分成多个脚本块以及依次将各个脚本块放入预置的缓冲区;如果预置缓冲区已满,则暂停该模块的执行,等到预置缓冲区拥有空间时再继续运行该模块;包括读取子模块和通信子模块的第二模块,所述读取子模块用于依序读取所述缓冲区中的一个脚本块,并释放相应存储空间;所述通信子模块用于传送该脚本块内容至服务器端,以及接收到服务器端的执行返回信息;当所述通信子模块接收到服务器端的执行返回信息后,通知所述读取子模块依序读取所述缓冲区中的下一个脚本块;上述两个子模块重复运行,直至该SQL脚本文件执行完毕;所述第一模块和第二模块并行运行。
7.如权利要求7所述的装置,其特征在于,对SQL脚本文件依照执行顺序,按照行数进行切分。
8.如权利要求7所述的装置,其特征在于,采用先进先出的方式,将各个脚本块形成队列放入所述缓冲区中;或者,针对各个脚本块进行顺序编号后放入所述缓冲区中。
9.如权利要求7所述的装置,其特征在于,还包括位于第二模块中的通知子模块,用于当第二模块释放所述缓冲区中的相应存储空间后,通知第一模块所述缓冲区已释放空间;或者,位于第一模块中的检测子模块,用于周期性的检测所述缓冲区的存储空间的变化,以获知所述缓冲区是否拥有空间。
10.如权利要求7所述的装置,其特征在于,当所述读取子模块读取所述缓冲区中的脚本块内容时,如果缓冲区为空,则等待。
全文摘要
本发明提供了一种在分布式系统中执行SQL脚本文件的方法,包括客户端启动第一线程和第二线程;所述第一线程和第二线程并行运行;第一线程用于将SQL脚本文件切分成多个脚本块以及依次将各个脚本块放入预置的缓冲区;如果预置缓冲区已满,则暂停第一线程,等到预置缓冲区拥有空间时再继续执行第一线程;第二线程用于完成以下步骤依序读取所述缓冲区中的一个脚本块,并释放相应存储空间;传送该脚本块内容至服务器端;接收到服务器端的执行返回信息后,依序读取所述缓冲区中的下一个脚本块,重复前述步骤,直至该SQL脚本文件执行完毕。本发明可以把文件执行中的压力平均分担到各个数据处理点,充分利用各部分的资源,从而大大提高整体的效率。
文档编号G06F9/46GK101093454SQ20071014046
公开日2007年12月26日 申请日期2007年8月14日 优先权日2007年8月14日
发明者徐锋 申请人:金蝶软件(中国)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1