发明内容
本发明的目的是在不改变网站内部原有生产流程的基础上,对生产流程中改变的数据进行捕捉,判断这些改变的数据需要更新哪些页面,进而产生更新页面的消息,从而实现无需人工干预的全自动页面更新流程。
为达到以上目的,本发明采用的技术方案是:一种底层数据的变化引发页面实时更新的解决方案,包括以下模块:
数据表配置模块,用于配置数据库中的数据表,并针对数据表中的数据变更设置触发器;
内存数据库模块,用于缓存数据库表中的部分数据及计算结果,并进行备份;
数据变更处理模块,用于获取变更数据,并将所述数据与内存数据库中的数据进行比对计算,判断是否需要进行更新,如果需要更新,则向发布消息生成模块提交消息队列;
发布消息生成模块,用于将消息队列中的消息组织成网站实际发布程序所需的消息格式,以实现页面发布。
进一步的,还包括发布模块,所述发布模块根据发布消息生成模块传来的发布消息,将更新后的数据在网站上进行发布。
进一步的,所述数据表配置模块除包括用于存放各种数据的数据表外,还包括:
为所选数据表创建的数据副表,所述副表的表结构与数据表一致,还包括三列,分别用于标志处理开始时间、标志处理完成时间以及标志操作类型;
触发器,在实际数据库中为所选数据表而建立,所述触发器建立在每张数据表上,并实时对数据表中的数据进行监控;
配置文件,存放数据表、数据副表相关数据字典的信息。
进一步的,所述触发器监控数据表上的Insert(插入)、Update(更新)、Delete(删除)操作,当有上述操作时,触发器将操作涉及到的数据表上的记录写入对应的数据副表,并标志相应的操作类型,通知数据变更处理模块哪些数据副表中有新记录。
进一步的,所述内存数据库模块具体包括:
数据初始化子模块:在系统初始化时运行,负责为内存数据库建立缓存结构即内存数据表,同时从实际数据库中加载所需数据到内存数据表中,初始化过程中还需要对网站系统中涉及到的每个模板文件进行解析,从中提取组件信息并计算组件结果,将其记录到内存数据表中;
数据同步子模块:为内存数据库的备份恢复提供支持,子模块定期将内存数据库中数据表的数据备份到文件系统,当数据备份完成后,将所有数据副表中处理结束时间在备份时间前的记录全部删除;
数据操作接口子模块:为数据变更处理模块提供查询及修改服务。
进一步的,所述数据变更处理模块具体包括:
获取通知子模块,用于接受来自触发器或内存数据库的通知,分析有哪些数据副表需要处理;
页面更新消息生成子模块,根据每条记录的类型,判断这条记录是否会产生发布消息,如果会则生成对应的消息到消息队列;
消息队列提交子模块,用于向发布消息生成模块提交所述消息队列。
进一步的,还包括:
记录读取子模块,对获取通知子模块中分析的数据副表,读取上述数据副表中的所有待处理记录,并标志这些记录的处理开始时间为当前时间;
记录结束子模块,对记录读取子模块中读取的所有记录,在页面更新消息生成子模块处理后,标志这些记录的处理结束时间为当前时间。
进一步的,所述页面更新消息生成子模块将记录读取子模块中读取的记录按“栏目类型”、“模板类型”、“栏目模板类型”、“稿件类型”四种类型加以区分,每种类型下按增加、删除、修改三种操作进行处理分析,来判断这条记录是否会产生发布消息,如果会则生成对应的消息加入消息队列。
此外,本发明还提供一种网站更新实时发布方法,包括以下步骤:
为数据表建立触发器;
实时监控数据表中的数据,当数据变更时,进行触发;
判断是否更新页面;如更新,
将更新消息传送给网站发布程序,实现页面发布。
进一步的,为数据表建立触发器,具体操作为:
选择网站数据库中的数据表;
为每个数据表创建相应副表;
为每个数据表创建触发器。
进一步的,所述副表结构与原数据表一致,且增加了三列,作用分别为:标志处理开始时间,标志处理完成时间,标志操作类型。
进一步的,所述操作类型包括:插入、更新、删除操作。
进一步的,触发器的操作具体为:所述触发器监控数据表上的Insert(插入)、Update(更新)、Delete(删除)操作,当有上述操作时,触发器将操作涉及到的数据表上的记录写入对应的数据副表,并标志相应的操作类型,然后通知数据变更处理模块这个数据副表需要处理。
进一步的,所述数据表为网站基础表,包括但不限于:栏目表、模板表、稿件表、栏目-稿件关联表、栏目-模板关联表、发布规则表、栏目-发布规则关联表。
进一步的,还包括缓存数据库表中的部分数据及计算结果,同时以定期将缓存中的数据备份到本地文件的方式保证数据的完整性。
进一步的,所述缓存的具体操作包括:
数据初始化,为内存数据库建立缓存结构即内存数据表,同时从实际数据库中加载所需数据到内存数据表中,对网站系统中涉及到的每个模板文件进行解析,从中提取组件信息并计算组件结果,将其记录到内存数据表中;
定期将内存数据库中数据表的数据备份到文件系统,当数据备份完成后,将所有数据副表中处理结束时间在备份时间前的记录全部删除,在内存数据库出现异常时重启内存数据库时,从文件系统恢复数据,并对所有数据副表中的记录,将其处理开始时间、处理结束时间置空,通知数据变更处理模块有哪些数据副表还有待处理的记录。
进一步的,还包括获取由数据库触发器反馈的变更数据,并将这种变更与内存数据库中的数据进行比对计算的操作,进而判断此次更新是否需要更新页面。
进一步的,判断是否更新页面的操作包括:
接受来自数据库触发器的变更请求;
从该数据副表中读取上述记录;
将上述记录结合内存数据库模块中的数据记录进行比对计算,将需要更新的信息组织成对应的消息写入消息队列;
向发布消息生成模块提交消息队列。
进一步的,还包括以下操作:
从该数据表中读取上述记录时,将数据表中这些记录的处理开始时间标记为当前时间;以及
记录处理完毕后,向数据库标记记录的处理结束时间。
进一步的,所述比较的操作具体为:将所述记录按“栏目类型”、“模板类型”、“栏目模板类型”、“稿件类型”四种类型加以区分,每种类型下按增加、删除、修改三种操作进行处理分析,判断这条记录是否会产生发布消息,如果会则生成对应的消息加入消息队列。
进一步的,发布具体操作为:对消息队列中的每条消息,重新组织成网站实际发布程序可以理解的消息格式,传送给发布程序,实现页面发布。
通过本发明所述的技术方案,能够快速、高效、自动的实现页面更新流程。
具体实施方式
下面结合附图对本发明的实现方案做进一步阐述。
为了便于对本发明技术方案的理解,对实施例中提到的术语进行如下解释:
术语 |
解释 |
栏目 |
网站的组织结构单位,一个网站在系统内部可以定义多个栏目(如网站的首页在系统内部就对应一个栏目),栏目间可以存在父子关系(网站的结构即为一棵栏目树) |
模板 |
一个模板就是一个文件,其内容为html代码。模板分栏目模板和稿件模板两类。栏目模板设定栏目发布页的样式,稿件模板设定一篇稿件发布页的样式。 |
组件 |
DreamWeaver(DW)的插件,用DW制作模板时,可以象在模板中插入html标签一样插入一个组件。组件提供可视化的编辑界面,同时在组件中可以直接嵌入html代码或者普通文本。组件最终以注释的形式保存在模板文件中。 |
术语 |
解释 |
稿件 |
数据单元。一篇稿件拥有标题、正文、作者、来源、链接等多个属性,可以附带多个素材(图片/音视频)。一个栏目下可以有多篇稿件。 |
发布规则 |
栏目有自己的发布规则,这个规则指明了栏目页面/栏目下稿件页面/模板关联文件/素材文件在磁盘上的存放位置。 |
在实际网站的场景中,编辑会随时为一个栏目增加、删除、修改一篇稿件;系统管理员会增加、删除、修改一个栏目,或为栏目新加模板或重新关联模板;美工会新上传一套模板,或上传一套模板替换现有的模板等操作。
本发明以下部分描述依赖于前面预定义的“术语”,对于“模板”、“组件”、“栏目”、“稿件”等术语间的关系可参见附图1(预定义术语说明图):栏目“国内报刊”下有三个子栏目“推荐报刊”、“关注单元”、“其他报刊”,子栏目“推荐报刊”中管理的是编辑推荐的热点报刊;“关注单元”、“其他报刊”管理关注的报刊及普通报刊。栏目“国内报刊”关联了栏目模板,这个模板中设了三个组件,分别指向“推荐报刊”、“关注单元”、“其他报刊”,并且每个组件都设定了查询条件(显示栏目下的哪些稿件,比如组件B只显示“关注单元”栏目下的头两篇稿件),以及一些html代码(设定组件的显示样式)。模板最终确定了栏目“国内报刊”页面的发布效果,如图2所述。
对发布模块,由于一个网站总会有自己的发布模块,并且这个发布模块也是现有技术中的方案,所以本发明不准备将这个模块作为重点来阐述。本方案中发布消息生成模块负责为网站的发布模块生成合适的发布消息格式,这种格式根据网站发布模块所需要的接口而定,如果发布模块需要的是socket消息,那么方案中发布消息生成模块就生成对应的socket消息,如果发布模块从数据库中读取发布消息,那么发布消息生成模块就在数据库中写入发布消息。
对于数据表配置模块:本模块是保证其他模板正确运行的基础,所以需要在系统初始化时进行配置,且只需配置一次。
以下结合附图3的实施方式对本模块的组成进行具体说明:
a.数据表,即模块预先选中数据库的一些基础表,这里需要从网站的数据库中选择“栏目”表、“模板”表、“稿件”表、“栏目-稿件”关联表、“栏目-模板”关联表等基础表;
b.数据副表,为每一张数据表创建对应的副表(如为稿件表创建稿件副表),副表的表结构与原表一致,但是增加了三列,一列标志处理开始时间,一列标志处理完成时间,一列标志操作类型;
c.触发器,对每一张表创建一个触发器,触发器监控插入/更新/删除操作,在原数据表中的发生相关操作后,由触发器将原数据表中的这条记录写入到对应副表,并在副表中标记这条记录的操作类型,触发器还将向数据变更处理模块发起通知,通知数据变更处理模块哪个表有变更的数据。例如数据库中有张表A,首先为表A建立一张副表A’,在表A上创建触发器,当A表插入一条记录后,触发器将这条记录写入A’,同时在A’中标记该记录类型为插入,向数据变更处理模块发送通知。
在这里,数据库中存放的是数据表,数据表中包含具体的数据,如稿件表中存放的就是稿件。因此,此处的触发器触发是指数据发生变化才会引起的触发,如增加、删除或者修改,跟数据表的定义无关。如稿件表中新增了一篇稿件,这个新增动作应该引起触发操作,或者稿件的标题有所修改,这个修改动作也应该引起触发。
为了达到更好的效果,还包括一配置文件,将上述副表的结构信息存放到配置文件中,便于数据变更处理模块从配置文件中读取配置。当然,数据表的结构信息也会存放到配置文件中。
对于内存数据库模块:本模块实质是一个内存缓存,在缓存中缓存了数据库表中的部分数据及一些计算结果,同时会定期将一些数据备份到本地文件中(内存数据库在备份过程中,不再接受来自数据变更处理模块的查询或更新请求)。内存数据库模块存放了数据变更处理模块所需要的所有数据,使得数据变更处理模块在进行判断处理时,直接从内存数据库中查询,不需要额外查询实际数据库。
内存数据库中的数据表包括:
a).栏目表
栏目表中存放的字段为:栏目ID、父栏目ID、发布状态,这些数据来自于实际数据库的栏目表的部分字段(实际数据库栏目表还包含栏目名称、栏目创建时间、栏目显示顺序等信息);
b).栏目发布稿件表
栏目发布稿件表中存放的字段为:栏目ID,栏目下已发布的稿件ID,这些数据来自于实际数据库的栏目稿件表,若实际数据库栏目稿件表中某篇稿件未发布,则这条记录不会缓存到内存数据库中;
c).栏目模板表
栏目模板表中存放的字段为:栏目ID,栏目模板ID,稿件模板ID,这些数据也来自实际数据库的栏目模板表的部分字段;
d).模板表
模板表中存放的字段为:模板ID,模板类型,这些数据来自于实际数据库的模板表的部分字段;
e).模板组件表
这个表是内存数据库特有的表,存放的字段为:模板ID,组件GUID。在美工上传一套模板到系统后,程序会检查这个模板页面的源码,从中找出模板所用到的所有组件,更新这张表;
f).组件信息表
这个表也是内存数据库特有的表,存放的字段为:组件GUID,组件关注的栏目ID,组件上次的查询结果(即上次发布时,根据这个组件的限制条件,从数据库中查询到的稿件ID集合),组件的查询条件(存放组件的限制条件,以及对应转换后的实际数据库的SQL查询语句),组件查询维度模型(对于组件的每一个限制条件建立一个维度,上次查询结果中的所有稿件的相关属性在这个维度上有一个投影,投影的最小~最大值就确定了这个维度的范围,比如组件的一个限制条件是取栏目前三篇稿件,那么稿件的显示顺序就是一个维度,上次的查询结果中三篇稿件的显示顺序分别为1.2,2.1,2.3,那么这个维度的范围就是1.2~2.3。组件查询维度模型是上次查询后查询条件的多维边界值,比如一个组件的查询条件是:查找ID为8的栏目下,稿件时间最新且稿件标题长度小于50的前两篇稿件,上次查询后查出了符合条件的两篇稿件,一篇稿件时间是2008-11-0808:08:08,一篇是2008-11-08 10:08:05,那么这个组件的查询维度是一个二维模型,其中一维是时间,范围为2008-11-08 08:08:08~2008-11-0810:08:05,另一维是标题长度,范围为0~50。这个维度模型主要是为了在增加或删除稿件时,尽快的判断,减少数据库查询次数。
下面是内存数据库中的表结构示例:
内存数据库模块具体包括以下部分:
数据初始化子模块:在系统初始化时运行,负责为内存数据库建立缓存结构(即内存数据表),同时从实际数据库中加载所需数据到内存数据表中。初始化过程中还需要对网站系统中涉及到的每个模板文件进行解析,从中提取组件信息并计算组件结果,将其记录到内存数据表中。
数据同步子模块:定期将内存数据库中数据表的数据备份到文件系统,当数据备份完成后,将所有数据副表中处理结束时间在备份时间前的记录全部删除。当内存数据库出现异常而重启时,内存数据库从文件系统中恢复数据,并对所有数据副表中的记录,将其处理开始时间、处理结束时间置空,这里应该将副表中所有记录的时间重置,虽然有些记录在内存数据库正常时已经处理结束,标记了处理结束时间,但是并没有同步到文件系统中,如果同步了则这条记录会被删掉,所以再次重启内存数据库、从文件系统恢复后,还需要把这条记录重置,当成未处理的,通知数据变更处理模块有哪些数据副表还有待处理的记录;
数据操作接口子模块:为数据变更处理模块提供查询及修改服务。
以下对本模块的初始化流程进行具体说明:
a.清空现有的数据,在内存中创建必要的表;
b.内存数据库从数据库中为每张表加载所需数据;
c.内存数据库为每个组件计算查询结果及查询维度。
内存数据库的职能是:存储一些必要的数据到内存,存储一些查询结果及查询条件。如果有必要重新计算查询结果,需要连接数据库进行计算,获取查询结果保存到内存数据库中。
对于数据变更处理模块:本模块需要获取由数据库触发器反馈的数据变更,并将这种变更与内存数据库中的数据进行比对计算,判断此次更新是否需要更新页面,如果需要更新,找出需要更新的栏目/稿件,向发布消息生成模块发送结果。数据变更处理模块是唯一更改内存数据库的模块。
在读取一条记录后,对这条记录标记处理开始时间,以免记录读取子模块再次扫描到这条记录重复处理。这条记录处理完毕后标记处理结束时间,表示正常处理结束。如果一条记录在处理过程中,由于内存数据库的无法访问导致处理失败,则这条记录只有处理开始时间,没有处理结束时间。内存数据库会在定期备份完毕后,将所有数据副表中,处理结束时间在备份时间前的记录全部删除。
这里定义数据变更处理模块与发布消息生成模板间的消息格式:
消息(对象ID,对象类型,操作类型)
在一条消息中,对象ID可以是栏目ID或者稿件ID,对象类型标志对象ID是栏目还是稿件,操作类型标志这条消息是发布页面还是删除页面。
为了减少发送重复消息给发布消息生成模块,数据变更处理模块中存有消息队列,当数据变更处理模块向消息队列添加消息时,由消息队列判断这条消息是否已存在于队列中,如果不在则向队列添加这条消息,如果这条消息已在消息队列中,则跳过该消息,在所有计算完成后,统一向发布消息生成模块提交队列。
所述数据变更处理模块具体包括:
获取通知子模块,用于接受来自触发器或内存数据库的通知,分析有哪些数据副表中有待处理的记录;
页面更新消息生成子模块,根据每条记录的类型,结合内存数据库模块进行分析,判断这条记录是否会产生发布消息,如果会则生成对应的消息到消息队列;
消息队列提交子模块,用于向发布消息生成模块提交所述消息队列。
记录读取子模块,对获取通知子模块中分析的数据副表,读取上述数据副表中的所有待处理记录,并标志这些记录的处理开始时间为当前时间;
记录结束子模块,对记录读取子模块中读取的所有记录,在页面更新消息生成子模块处理后,标志这些记录的处理结束时间为当前时间。
页面更新消息生成子模块将记录读取子模块中读取的记录按“栏目类型”、“模板类型”、“栏目模板类型”、“稿件类型”四种类型加以区分,每种类型下按增加、删除、修改三种操作进行不同处理分析,将分析得出的消息加入消息队列。
页面更新消息生成子模块写入消息队列中的消息分为以下四种:
(栏目ID,’栏目’,’删除’)——表示网站中该栏目页面需要删除,网站发布程序可以生成空白页或页面跳转,这样当用户访问该栏目页面的URL地址时,会返回给用户空白页面或直接跳转到网站的地址不存在页面。
(栏目ID,’栏目’,’发布’)——表示网站中该栏目页面需要重新发布。
(稿件ID,’稿件’,’删除’)——表示网站中该稿件页面需要删除,网站发布程序处理同栏目删除。
(稿件ID,’稿件’,’发布’)——表示网站中该稿件页面需要重新发布。
下面分具体情况进行说明:
1.栏目类型:
1.1记录是删除栏目:需要从内存数据库模块的栏目表中进行查找。从内存数据库模块的栏目表中以该栏目为根节点构造一个树(树中每个节点表示一个栏目,其在栏目表中有几个子栏目,那么在树中这个节点对应拥有几个分支节点,如果其在栏目表中没有子栏目,这个节点为叶子节点)。从这棵树中找到状态为已发布的所有栏目——记为栏目集合A、从栏目发布稿件表中找到这些栏目下所有已发布的稿件——记为稿件集合B,对于A中等每一个栏目,生成(栏目ID,’栏目’,’删除’)消息到消息队列,对于B中每一篇稿件,生成(稿件ID,’稿件’,’删除’)消息到消息队列。在内存数据库中的组件信息表中进行查找,找到关注A中任何栏目的所有组件、通过模板组件表找到对应的所有模板——记为模板集合C,对于C中每一个模板:
1.1.1如果从模板表中得知该模板为栏目模板,则通过栏目模板表找到这个模板关联的且不属于集合A中的栏目——记为栏目集合D,则对D中的每一个栏目,将(栏目ID,’栏目’,’发布’)消息写入消息队列。
1.1.2如果模板为文章模板,则通过栏目模板表找到这个模板的且不属于集合A中的栏目——记为栏目集合E,对E中的每一个栏目,从栏目发布稿件表中找到栏目下所有已发布的稿件,对其中每篇稿件,将(稿件ID,’稿件’,’发布’)消息写入消息队列。
最后,对这棵树中的每个节点栏目,将内存数据库中栏目表、栏目发布稿件表、栏目模板表中与该栏目有关的记录删除,然后标记记录的处理结束时间为当前时间;
1.2记录是更新栏目
直接标记记录的处理结束时间为当前时间;
1.3记录是增加栏目
在内存数据库的栏目表中加入这个栏目,标记记录的处理结束时间为当前时间;
2.模板类型
2.1记录是增加模板
在内存数据库的模板表中加入这个模板。
对模板文件进行分析,提取模板中的组件,将模板组件信息写入内存数据库中的模板组件表;对每一个组件进行计算,将计算后的查询结果、查询维度等信息写入内存数据库中的组件信息表。
标记记录的处理结束时间为当前时间;
2.2记录是修改模板
对模板文件进行分析,提取模板中的组件,将模板组件信息写入内存数据库中的模板组件表;对每一个组件进行计算,将计算后的查询结果、查询维度等信息写入内存数据库中的组件信息表。
2.2.1如果该模板是栏目模板,则将栏目模板表中关联该模板的且已发布的栏目,对其中每个栏目,将(栏目ID,’栏目’,’发布’)消息写入消息队列。
2.2.2如果该模板是文章模板,则将栏目模板表中关联该模板的栏目下所有已发布的稿件,对其中的每篇稿件,将(稿件ID,’稿件’,’发布’)消息写入消息队列。
对该模板执行标记Mark1。标记记录处理结束时间为当前时间。
2.3记录是删除模板
2.3.1如果模板是栏目模板,从栏目模板表中找到关联该模板的所有且已发布的栏目,对于每个栏目,将(栏目ID,’栏目’,’删除’)消息写入消息队列。
2.3.2如果模板是稿件模板,从栏目模板表中找到关联该模板的所有栏目,对于每个栏目下所有已发布的稿件,将(稿件ID,’稿件’,’删除’)消息写入消息队列。
在模板表、模板组件表中删除模板相关数据。标记记录的处理结束时间为当前时间;
3.栏目模板类型
3.1记录是新增栏目模板的对应关系
内存数据库栏目模板表中增加一条数据。
标记Mark1开始:【
从内存数据库中组件信息表中找到这个模板中的所有组件,对于每个组件计算结果中涉及到的稿件,如果之前未发布,则将(稿件ID,’稿件’,’发布’)消息写入消息队列。
将这个模板中所有组件涉及到的且之前未发布的栏目——记为栏目集合A。对A中的每个栏目,将(栏目ID,’栏目’,’发布’)消息写入消息队列。对A中的每个栏目,如果其关联了栏目模板,则执行标记Mark1。
】标记Mark1结束。
3.1.1如果该模板是栏目模板,则将(栏目ID,’栏目’,’发布’)消息写入消息队列。
3.1.2如果该模板是文章模板,则对栏目下所有已发布的稿件,对其中的每篇稿件,将(稿件ID,’稿件’,’发布’)消息写入消息队列。
标记记录处理结束时间为当前时间。
3.2记录是更新栏目模板的对应关系
内存数据库栏目模板表中更新对应数据。其余操作同3.1
3.3记录是删除栏目模板的对应关系
内存数据库栏目模板表中删除对应数据
3.3.1如果该模板是栏目模板,将(栏目ID,’栏目’,’删除’)消息写入消息队列。
3.3.2如果该模板是文章模板,对栏目下所有已发布的稿件,对其中的每篇稿件,将(稿件ID,’稿件’,’删除’)消息写入消息队列。
标记记录处理结束时间为当前时间。
4.稿件类型
4.1记录是增加稿件
获取稿件所在的栏目ID,从内存数据库中的组件信息表找到关注该栏目的所有组件,对其中每一个组件,需要根据组件的查询维度及查询条件,判断这篇稿件是否影响了组件的查询结果。
4.1.1如果对组件的查询结果产生影响,需要重新根据组件的查询条件,向数据库提交查询,获取查询结果后更新内存数据库组件信息表中组件的查询维度及查询结果。同时根据模板组件表获取组件所在的模板,根据栏目模板表获取涉及到的栏目,如果栏目之前已发布过,则需要重新发布该栏目,将(栏目ID,’栏目’,’发布’)消息写入消息队列;如果这篇稿件未发布过,将(稿件ID,’稿件’,’发布’)消息写入消息队列,同时对这篇稿件用到的文章模板,执行标记Mark1。
在栏目发布稿件表中将这篇稿件标记为已发布。标记记录处理结束时间为当前时间。
4.1.2如果对组件的查询结果不产生影响,标记记录处理结束时间为当前时间。
4.2记录是更新稿件
操作同4.1
4.3记录是删除稿件
获取稿件所在的栏目ID,从内存数据库中的组件信息表找到关注该栏目的所有组件,对其中每一个组件,需要根据组件的查询维度及查询条件,判断这篇稿件是否影响了组件的查询结果。
4.1.1如果对组件的查询结果产生影响,需要重新根据组件的查询条件,向数据库提交查询,获取查询结果后更新内存数据库组件信息表中组件的查询维度及查询结果。同时根据模板组件表获取组件所在的模板,根据栏目模板表获取涉及到的栏目,如果栏目之前已发布过,则需要重新发布该栏目,将(栏目ID,’栏目’,’发布’)消息写入消息队列;如果这篇稿件已发布过,将(稿件ID,’稿件’,’删除’)消息写入消息队列。
从栏目发布稿件表中删除记录。
标记记录处理结束时间为当前时间。
4.1.2如果对组件的查询结果不产生影响,从栏目发布稿件表中删除记录。标记记录处理结束时间为当前时间。
对于发布消息生成模块:本模块对消息队列中的每条消息,重新组织成网站实际发布程序可以理解的消息格式,传送给发布程序,实现页面发布。
下面对本发明中的主要模块——内存数据库模块中几种特殊情况作进一步地描述:
第一种情况:内存数据库突然出现异常中断后恢复。
内存数据库在没有外部操作时(没有与数据变更处理模块发生交互),定期将内部存储的数据写入磁盘文件。当写入成功后,标记写入时间,同时将“数据表配置文件”记录的所有副表中,处理结束时间在写入时间前的记录全部删除。
当内存数据库中断后恢复时,首先检查磁盘文件,找到最新的写入时间,如果没有写入时间,标志内存数据库需要重新初始化;如果有最新的写入时间,内存数据库根据磁盘文件重建内部数据结构,恢复工作。恢复后对“数据表配置文件”记录的所有副表中的所有记录,将其处理开始时间、处理结束时间重置为空,然后向数据变更处理模块发送通知,提醒数据变更处理模块哪些副表中有记录待处理。
第二种情况:数据变更处理模块事务提交失败。
数据变更处理模块向内存数据库事务提交成功时,会设置数据库副表中相关记录的处理结束时间。当提交失败时,其原因可能是内存数据库工作不正常或没有启动。需要将失败的时间等详细信息记录到日志文件,以发现问题。在内存数据库恢复后,继续处理之前未处理或处理失败的数据。
本发明同时提供一种网站更新实施发布的方法,用于在底层数据发生变化时,自动进行更新,实现页面发布。主要方法包括如下步骤:
为数据表建立触发器;
实时监控数据表中的数据,当数据变更时,进行触发;
判断是否更新页面;如更新,
将更新消息传送给网站发布程序,实现页面发布。
其中,为数据表建立触发器,具体操作为:
选择网站数据库中的数据表;
为每个数据表创建相应副表;
为每个数据表创建触发器。
数据表以及数据副表的结构,以及触发器的触发操作过程,由于跟上述系统发明中的一一对应,在此不再具体介绍。
还包括缓存数据库表中的部分数据及计算结果,同时以定期将缓存中的数据备份到本地文件的方式保证数据的完整性的操作。所述缓存的具体操作包括:
数据初始化,为内存数据库建立缓存结构即内存数据表,同时从实际数据库中加载所需数据到内存数据表中,对网站系统中涉及到的每个模板文件进行解析,从中提取组件信息并计算组件结果,将其记录到内存数据表中;
定期将内存数据库中数据表的数据备份到文件系统,当数据备份完成后,将所有数据副表中处理结束时间在备份时间前的记录全部删除,在内存数据库出现异常时重启内存数据库时,从文件系统恢复数据,并对所有数据副表中的记录,将其处理开始时间、处理结束时间置空,通知数据变更处理模块有哪些数据副表还有待处理的记录。
其中,判断是否更新页面的操作包括:
接受来自数据库触发器的变更请求;
从该数据副表中读取上述记录;
将上述记录结合内存数据库模块中的数据记录进行比对计算,将需要更新的信息组织成对应的消息写入消息队列;
向发布消息生成模块提交消息队列。
为了达到更好的效果,具体实施中还包括以下操作:
从该数据表中读取上述记录时,将数据表中这些记录的处理开始时间标记为当前时间;以及
记录处理完毕后,向数据库标记记录的处理结束时间。
将上述记录结合内存数据库模块中的数据记录进行比对计算,具体操作为:将所述记录按“栏目类型”、“模板类型”、“栏目模板类型”、“稿件类型”四种类型加以区分,每种类型下按增加、删除、修改三种操作进行处理分析,判断这条记录是否会产生发布消息,如果会则生成对应的消息加入消息队列。
下面结合附图4实施方式对本发明的方法进行说明:
(601)定义数据表、建立触发器及数据副表;
(602)程序初始化,内存数据库初始化;
内存数据库初始化时:需要从数据库中加载输入,并且从本地文件中读取/分析模板内容,进行组件计算,将计算结果保存到内存表中;内存数据库定期将存储的数据写入本地文件,当异常中断后恢复时,也需要从本地文件中加载数据;
(603)触发器(此处用oracle表)监控到数据变化,通知数据变更处理模块;
(604)数据变更处理模块从通知中获取表名,从数据库中获取表中所有变更的数据;
(605)数据变更处理模块标记数据的处理时间;
(606)数据变更处理模块对变更的数据进行分类处理,并将这种变更与内存数据库中的数据进行比对计算,判断此次更新是否需要更新页面,如果需要更新,找出需要更新的栏目/稿件;
(607)数据变更处理模块需要更新内存数据库时,向内存数据库发起事务请求;
(608)数据变更处理模块将需要处理的消息写入消息队列,传给发布消息生成模块;
(609)记录处理完毕后,向数据库标记记录的处理结束时间;
(610)发布消息生成模块获取消息队列中的消息,生成适合网站发布程序的消息格式,将消息传给网站发布程序,实现栏目/稿件页面发布。
具体进行比对计算的要求和标准由于上述系统技术方案的实施方式已经具体描述,在此不细讲。
本发明有别于其他类似解决方案的地方在于:由数据表触发器在数据库层面捕捉数据变更,由程序处理数据变更;采用内存数据库快速高效维持数据;自动找到需要更新的栏目/稿件,并产生发布消息。
通过本发明所述的技术方案,能够快速、高效、自动的实现页面更新流程。
以上所述,仅为本发明实施例的具体实施方式,但本发明实施例的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明实施例的保护范围应该以权利要求的保护范围为准。