数据的动态刷新方法及系统的制作方法

文档序号:6574191阅读:248来源:国知局
专利名称:数据的动态刷新方法及系统的制作方法
技术领域
本发明涉及数据处理技术,特别是涉及数据的动态刷新方法及系统。
背景技术
在各种基于配置驱动的系统中,各个应用进程(即使用配置数据的进程)从配置文件中读取配置数据,然后加载到各自的堆内存中使用。但随着业务的不断调整,对配置数据的刷新十分频繁。当需要更新配置数据时,为防止应用进程在配置文件更新后仍使用原配置数据,从而导致数据混乱而出现错误,所以必须对每个应用进程分别加载新的配置数据。
现有的技术是设置标志位,每个进程在接入业务请求后,首先检查所述标志位是否标识需要更新配置数据。如果需要更新配置数据,则每个进程都独立从配置文件中读取新的配置数据,并存放在本进程的堆内存中,供后续的业务处理使用。
在各个应用进程从配置文件中读取新配置数据并加载到堆内存的这段时间里,进程无法处理已经接入的业务请求,将造成业务处理的短暂中断,而在配置数据刷新完后还需要重新启动。对于金融领域中的交易处理系统,由于金融业务的交易量庞大,交易流量很高,这种短暂的中断将造成大量的交易处理失败,影响交易处理系统的效率和成功率。
而且,每个进程的堆内存中都独立保存一份配置数据,会浪费大量的内存资源。并且,应用进程每次读取文件操作也会消耗大量的CPU,从而影响正在处理交易的进程性能。

发明内容
本发明所要解决的技术问题是提供一种数据的动态刷新方法及系统,以解决现有刷新方式造成应用进程长时间等待甚至超时,从而造成业务处理短暂中断,影响业务处理效率和成功率的问题。
为解决上述技术问题,本发明提供了数据的动态刷新方法,包括开辟共享空间,将共享数据以对象形式存放在所述共享空间中;在同一个源文件中设置参数化的加载函数和访问函数;通过对所述参数赋值,刷新进程调用加载函数对所述共享数据进行刷新操作;通过对所述参数赋值,应用进程调用访问函数对所述共享数据进行访问操作。
其中,刷新进程按照以下步骤进行刷新操作重新创建共享对象,调用加载函数将更新的数据加载到共享空间。
优选的,还包括在所述共享空间中划分两个区域存放共享数据,并设置标识其中一个区域的标志位信息;应用进程读取所述标志位信息,确定其中一个区域为当前使用的共享数据,进行访问操作;刷新进程读取所述标志位信息,确定对当前使用区域外的另一个区域进行共享数据的刷新操作,刷新成功后修改所述标志位信息。
其中,所述标志位信息用于指示应用进程当前使用的共享区域,或者指示刷新进程使用的在所述当前使用区域外的另一个共享区域。
其中,所述刷新进程和应用进程并行运行。
本发明还提供了数据的动态刷新系统,包括共享空间,用于以对象形式存放共享数据;对象创建单元,用于开辟所述共享空间,创建对应共享数据的共享对象;数据加载单元,用于提供参数化的加载函数,刷新进程通过对所述参数赋值,将共享数据加载到所述共享空间;数据访问单元,用于提供参数化的访问函数,应用进程通过对所述参数赋值,访问共享数据。
其中,所述数据加载单元中的加载函数和数据访问单元中的访问函数置于同一个源文件中编译。
其中,刷新进程每次刷新共享数据,还调用所述对象创建单元重新创建共享对象。
优选的,所述共享空间划分为两个区域存放共享数据,并设置标识其中一个区域的标志位信息;数据访问单元通过所述标志位信息,确定其中一个区域为当前使用的共享数据,应用进程进行访问;刷新进程通过所述标志位信息,确定对当前使用区域外的另一个区域进行共享数据的刷新操作,刷新成功后修改所述标志位信息。
其中,所述数据加载单元和数据访问单元并行运行。
其中,所述标志位信息用于指示应用进程当前使用的共享区域,或者指示刷新进程使用的在所述当前使用区域外的另一个共享区域。
与现有技术相比,本发明具有以下优点首先,本发明采用数据共享的方法,将配置数据从各个应用进程的堆内存移到共享内存中,所有的应用进程都从所述共享内存中读取配置数据。在对配置数据刷新时,只需对共享内存加载一次数据即可,大大减少了各个进程的等待时间,提高了业务处理的效率和成功率。而且,共享内存的方式减少了每个应用进程的内存消耗。
其次,在使用共享内存时,通过同源编译的方式,即将创建共享对象的代码和使用共享对象的代码在同一个源文件中进行编译,解决了共享内存中共享对象的虚函数使用问题。与其他解决方式相比,本发明所述方法实现简单。
再次,本发明优选的,将共享内存划分两个区域来存放两组结构相同的配置数据,并设置标志位,通过切换使用两组配置数据,达到动态刷新配置数据的目的。刷新进程和应用进程可以并行运行,刷新过程不会造成应用进程的中断,即不需要重启应用进程,即可安全地刷新配置数据。而且,所有应用进程在配置数据的刷新操作完成后就能立即使用更新后的数据,更把使用共享数据的进程因配置数据被刷新而暂停运转的时间减少到了一个对系统正常运作可以忽略不计的程度,达到安全地动态刷新配置数据的目的。


图1是本发明中解决对象共享问题的示意图;图2是本发明所述共享内存的数据结构示意图;图3是本发明优选实施例中交易处理进程的流程图;图4是本发明优选实施例中配置刷新进程的流程图;图5是本发明所述数据的动态刷新系统结构框图。
具体实施例方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式
对本发明作进一步详细的说明。
本发明为解决上述问题,采用数据共享的方法,将配置数据存放在共享内存中,所有的业务应用进程都从所述共享内存中读取配置数据,所述配置数据即成为共享数据。如果需要更新配置数据,只需对共享内存中的数据进行一次更新即可。
从时间和空间而言,共享内存是现代操作系统具备的最高效的进程间通信通道。共享内存同时将地址空间映射到多个进程,一个进程只需附接到共享内存并像使用普通内存一样使用它,就可以获取与其他进程完全相同的内存数据。本发明的技术方案是将配置数据存放在共享内存中,所有的业务应用进程都附接所述共享内存。
由于在原来的刷新方式中,所述配置数据的数据结构采用了C++面向对象的方法开发,以对象的形式存放在堆内存中,由创建对象的进程使用。本发明中,为减少修改数据存储结构的工作量和风险,直接将配置对象存放在共享内存中。但是,开发人员在实现过程中发现,在共享内存中创建的配置对象,可以被创建所述对象的进程正常访问,而其他所有进程共享访问会导致应用系统崩溃。
经过反复调试,在深入研究C++模型中编译器的编译原理后,发现本发明实施例中对象共享存在的问题是C++对象中总是包含指向各种VTable(虚函数表)和子对象的指针,所述指针是与特定进程相关的,要让这种对象可以共享,就需要确保在所有进程中这些指针的目标都驻留在相同的地址。由于所述配置对象中使用了虚函数,而C++对象模型没有成功解决虚拟继承的问题,所以各个应用进程在访问共享数据时,就会出现虚函数表地址指针不一致的问题。由上可知,通过共享内存解决数据的刷新问题,并不是轻而易举就能实现的问题,也不是计算机领域所有的技术人员都熟知的技术问题。而关于C++编译原理以及对象中的虚函数和虚拟继承的基础知识,不在本发明详细说明的范围。
在共享内存中具体使用C++对象时需要考虑两个主要问题第一,VTable指针用于访问虚函数,而对数据成员的访问直接使用编译时偏移量实现。因此,对于所有这种共享对象来说,所有进程中的VTable和虚函数都应该具有相同的虚地址。
第二,虚拟继承的对象有指向基对象的基指针,所述基指针引用进程的数据段,而且永远是特定于进程的。因此,难以确保其他进程中都有相同的数字值。
针对上述两个问题,可以有以下解决方法其一,改变C++编译器的编译方式,从根本上解决虚地址指针不一致的问题,但是对于大规模的业务应用,所述方式容易产生错误,而且实现起来比较困难;其二,改变配置数据原有的数据结构,在对象中不使用虚函数,而通过其他方法实现与虚函数相同的功能,如果采用这种方法,则实现复杂,而且大大减弱了“对象”的功能。所述两种方法在理论上可以解决对象共享问题,但实际操作起来比较困难。
本发明提出一种简单的解决方法,只要将创建共享对象的代码和使用共享对象的代码在同一个源文件中进行编译,则创建共享对象的进程和访问共享对象的进程的VTable和虚函数都一定具有相同的虚地址,所述方法称为同源编译。因此,同源编译能够解决共享内存中共享对象的虚函数使用问题。在面向对象模型中,涉及到进程的执行,都会出现使用虚函数的对象共享问题,因此本发明提出的解决方法适用于所有涉及进程执行的对象模型。
下面结合本发明实施例来说明同源编译的解决方法,参照图1,是本发明中解决对象共享问题的示意图。其中,加载函数用于将数据加载到内存空间中,访问函数用于对内存空间中的数据进行访问操作。本实施例中配置数据被创建成配置对象(即共享数据对象),需要先在内存中开辟出共享空间,然后调用所述加载函数,将配置数据加载到所述共享内存中,实现对象内成员的初始化。对所述配置对象进行刷新,需要重新创建配置对象,并调用所述加载函数将更新后的配置数据加载到共享内存中,即对象内的成员都用新的配置信息初始化。访问配置对象,需要调用所述访问函数实现。
由于配置数据被设置成共享数据,所以原来由同一个进程控制的刷新和访问功能,现在各自独立,即分别由刷新进程和访问进程执行。但是根据同源编译的原理,需要将所述加载函数和访问函数置于同一个源文件中进行编译,才能使创建共享对象的进程和访问共享对象的进程的VTable和虚函数都一定具有相同的虚地址。为此,将所述包含加载函数和访问函数的源文件参数化,通过对参数赋值,执行所述文件的刷新进程调用加载函数,而执行所述文件的应用进程则调用访问函数。
上述对配置数据刷新时,只需对共享内存加载一次数据即可,大大减少了各个进程的等待时间,提高了业务处理的效率和成功率。而且,共享内存的方式减少了每个应用进程的内存消耗。
在解决了对象共享问题的基础上,本发明优选的,将所述共享内存划分出两个区域来存放两组结构相同的配置数据,并设置标志位,用于标识其中一组数据,通过切换使用两组配置数据,达到动态刷新配置数据的目的,并保证所有应用进程在配置数据的刷新操作完成后就能立即使用更新后的数据。参照图2,是本发明所述共享内存的数据结构示意图。
所述共享内存分为内存头和内存体两部分,内存体又划分为两个共享区域。其中,所述内存头中存放标志位信息和共享区域A、共享区域B的首地址指针,所述内存体中以对象形式存放两组结构相同的配置数据。在访问和共享内存的过程中,通过读取标志位信息确定要访问的共享区域,然后读取相应的首地址指针,从而正确获得共享数据的存储位置。
例如,创建一片共享内存,并将共享内存划分为两个片区A和B,系统启动后先将配置数据加载到其中一个片区(例如A片区)。业务应用进程需要使用配置数据时,先根据标志位获得A片区的首地址,然后访问共享配置对象。当需要刷新配置数据的时候,刷新进程会在B片区创建共享配置对象,将新的配置数据加载到B片区,然后将标志位修改为B片区的首地址。这样,所述应用进程和刷新进程可以并行执行而互不干扰,业务处理进程就能够安全使用新的配置数据了。
下面结合金融领域的交易处理过程进行说明。参照图3,是本发明优选实施例中交易处理进程的流程图,所述交易处理进程执行对共享配置数据的访问操作。
步骤301,交易处理进程收到交易请求,需要从共享内存中获取配置数据。
步骤302,读取内存头信息,获取配置数据的标志位信息。通常,所述标志位信息指示执行数据访问操作的一个共享区域,但也可以指示执行数据刷新操作的一个共享区域。
步骤303,根据所述标志位信息,读取当前正在使用的一组配置数据。其中,所述当前正在使用的数据是指正在被其他多个交易处理进程共享访问的数据。如果标志位信息指示执行数据访问操作的共享区域A,则按照标志位的指示从A片区首地址直接读取配置数据;如果标志位信息指示执行数据刷新操作的共享区域B,则读取配置数据就需要从A片区首地址开始。
步骤304,交易处理进程根据配置数据处理交易。
参照图4,是本发明优选实施例中配置刷新进程的流程图,当配置文件中的数据更新后,执行以下操作步骤401,配置刷新进程读取配置文件中的配置数据。
步骤402,读取内存头信息,获取配置数据的标志位信息。
步骤403,根据所述标志位信息,对另一组当前不使用的配置数据进行刷新操作。
步骤404,完成刷新操作后,配置刷新进程修改标志位信息。如果标志位指示的是当前正在使用的一组配置数据,则将新加载的那一组配置数据标识为当前正在使用的数据。交易处理进程在接收到新的交易请求后,会按照标志位的标识读取最新的配置数据来处理交易。
因此,本发明提供的动态刷新方法,保证所有交易处理进程在配置数据的刷新操作完成后就能立即使用更新后的数据,更把使用共享数据的进程因配置数据被刷新而暂停运转的时间减少到了一个对系统正常运作可以忽略不计的程度,达到安全地动态刷新配置数据的目的。
针对上述数据刷新方案,本发明还提供了具体的实现系统,参照图5,是本发明所述数据的动态刷新系统结构框图。所述系统包括共享空间501、对象创建单元502、数据加载单元503和数据访问单元504。
共享空间501是在内存中开辟出来的一段公共存储空间,用于存放配置数据,供多个进程共享使用。本发明实施例中,配置数据是以对象的形式存放的,并且使用了虚函数。
对象创建单元502用于开辟所述共享空间501,并且重载了C++语言中的new操作,将共享对象的指针指向共享内存,而不是堆。对象创建单元502调用所述数据加载单元503,将配置数据加载到开辟的共享空间501中,初始化对象内成员。
数据加载单元503设置加载函数,用于执行数据加载操作,将配置数据加载到开辟的共享空间501中;数据访问单元504设置访问函数,用于对共享空间501中的配置数据执行访问操作。根据同源编译的原理,需要将实现数据加载功能的加载函数和实现数据访问功能的访问函数置于同一个源文件中,这样编译后才能产生相同的虚函数表。因此将所述源文件设置成参数化的调用,当某进程执行所述文件时,通过参数赋值,或者调用加载函数,或者调用访问函数。
例如,配置刷新进程每次执行刷新操作时,通过对象创建单元502重新开辟所述共享空间501,然后对参数赋值,调用数据加载单元503将新的配置数据加载到共享空间中。交易处理进程访问共享数据时,对所述参数赋值,调用数据访问单元504进行访问操作。
本发明优选的,为保证对同一共享数据执行访问和刷新的操作能够并行运行,将共享空间501划分为两个区域来存放两组结构相同的配置数据。为保证所有应用进程在配置数据的刷新操作完成后就能立即使用更新后的数据,还设置了标志位来标识其中的一组数据。通过读取所述标志位信息,应用进程调用数据访问单元504对当前正在使用的一组配置数据进行访问,刷新进程调用数据加载单元503刷新另一组当前不使用的配置数据,并修改标志位信息,使数据访问单元504在下次访问时立即使用更新的配置数据。其中,所述标志位信息可以指示应用进程访问的共享区域,也可以指示刷新进程访问的共享区域。
通过切换使用两组配置数据,可以动态刷新配置数据,而不影响对所述配置数据的共享访问,因此把使用共享数据的进程因配置数据被刷新而暂停运转的时间减少到了一个对系统正常运作可以忽略不计的程度,达到安全地动态刷新配置数据的目的。而且,还减少了内存消耗,提高了系统的处理效率和成功率。
以上对本发明所提供的数据的动态刷新方法及系统,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式
及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。
权利要求
1.数据的动态刷新方法,其特征在于,包括开辟共享空间,将共享数据以对象形式存放在所述共享空间中;在同一个源文件中设置参数化的加载函数和访问函数;通过对所述参数赋值,刷新进程调用加载函数对所述共享数据进行刷新操作;通过对所述参数赋值,应用进程调用访问函数对所述共享数据进行访问操作。
2.根据权利要求1所述的方法,其特征在于,刷新进程按照以下步骤进行刷新操作重新创建共享对象,调用加载函数将更新的数据加载到共享空间。
3.根据权利要求1所述的方法,其特征在于,还包括在所述共享空间中划分两个区域存放共享数据,并设置标识其中一个区域的标志位信息;应用进程读取所述标志位信息,确定其中一个区域为当前使用的共享数据,进行访问操作;刷新进程读取所述标志位信息,确定对当前使用区域外的另一个区域进行共享数据的刷新操作,刷新成功后修改所述标志位信息。
4.根据权利要求3所述的方法,其特征在于所述标志位信息用于指示应用进程当前使用的共享区域。
5.根据权利要求3所述的方法,其特征在于所述标志位信息用于指示刷新进程使用的在所述当前使用区域外的另一个共享区域。
6.根据权利要求3所述的方法,其特征在于所述刷新进程和应用进程并行运行。
7.数据的动态刷新系统,其特征在于,包括共享空间,用于以对象形式存放共享数据;对象创建单元,用于开辟所述共享空间,创建对应共享数据的共享对象;数据加载单元,用于提供参数化的加载函数,刷新进程通过对所述参数赋值,将共享数据加载到所述共享空间;数据访问单元,用于提供参数化的访问函数,应用进程通过对所述参数赋值,访问共享数据。其中,所述数据加载单元中的加载函数和数据访问单元中的访问函数置于同一个源文件中编译。
8.根据权利要求7所述的系统,其特征在于刷新进程每次刷新共享数据,还调用所述对象创建单元重新创建共享对象。
9.根据权利要求7所述的系统,其特征在于所述共享空间划分为两个区域存放共享数据,并设置标识其中一个区域的标志位信息;数据访问单元通过所述标志位信息,确定其中一个区域为当前使用的共享数据,应用进程进行访问;刷新进程通过所述标志位信息,确定对当前使用区域外的另一个区域进行共享数据的刷新操作,刷新成功后修改所述标志位信息。
10.根据权利要求7所述的系统,其特征在于所述数据加载单元和数据访问单元并行运行。
11.根据权利要求7所述的系统,其特征在于所述标志位信息用于指示应用进程当前使用的共享区域。
12.根据权利要求7所述的系统,其特征在于所述标志位信息用于指示刷新进程使用的在所述当前使用区域外的另一个共享区域。
全文摘要
本发明公开了数据的动态刷新方法及系统,解决现有刷新方式造成应用进程长时间等待甚至超时,从而造成业务处理短暂中断,影响业务处理效率和成功率的问题。所述方法包括开辟共享空间,将共享数据以对象形式存放在所述共享空间中;在同一个源文件中设置参数化的加载函数和访问函数;通过对所述参数赋值,刷新进程调用加载函数对所述共享数据进行刷新操作;通过对所述参数赋值,应用进程调用访问函数对所述共享数据进行访问操作。本发明通过同源编译实现了使用虚函数的对象共享问题,只对共享数据刷新的方式,减少了内存消耗,提高了业务处理的效率。而且,通过切换使用两组结构相同的共享数据,可以动态刷新共享数据,而不影响对数据的共享访问。
文档编号G06F11/00GK101017448SQ200710079439
公开日2007年8月15日 申请日期2007年3月12日 优先权日2007年3月12日
发明者严志根, 施健, 周子坚, 张涛, 杨忠伟, 肖鲁川, 郑炜杰, 杨芬, 吴炜斯, 王迎春 申请人:中国建设银行股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1