论文部分内容阅读
[摘 要] 本文从實际应用的角度,讨论了基于Domino平台的协同办公应用中数据库膨胀的原因以及解决方案。从技术实现的角度,进行了分析设计;结合LS开发技术,讨论了实现功能的通用方法和步骤,给出了实际应用的实例和效果供参考。
[关键词] 分库;入口库;文档库;代理
doi : 10 . 3969 / j . issn . 1673 - 0194 . 2013 . 15. 035
[中图分类号] TP317.1 [文献标识码] A [文章编号] 1673 - 0194(2013)15- 0054- 03
在大庆油田协同办公领域,基于Domino的B/S架构应用了许多年,随着协同办公系统在油田应用的深入,各类业务数据不断增长,Domino数据库不断膨胀,甚至超过最大64G的限制。当数据库里数据达到一定程度后,数据库读、写性能明显下降,以至于会影响整个应用系统的性能。虽然Domino本身提供归档等功能,但只能在一定程度上缓解数据库膨胀问题。对于要求一直在线访问的数据,并且数据量增长迅速的应用,归档则无能为力。本文主要讨论在Domino平台上,充分利用其开发和应用方面的特性,结合以往的实际经验,实现一种能够根据设定的数据量自动分库,同时对应用透明的功能。
1 Domino平台简介
Domino是一个群件平台,提供了一个简化的、高安全性的实时工作环境,版本由4.X到8.X,平台功能不断升级和增强。在企业中利用其强大的业务应用、协作应用和通讯应用,能快速开发行政办公、业务管理以及个人事务处理等系统,提高了员工的工作效率,简化了业务流程,提高了企业业务的响应能力。
2 设计实现
进行基于Domino的应用开发,主要使用Domino的数据库对象。数据库对象集数据存储、表单、视图、代理等于一身,应用的开发可以使用一个或多个数据库。为了降低开发难度,提高开发效率,大多选择一个数据库进行应用开发。因此,数据和设计元素都存储在这个数据库中,库数据量的膨胀就不可避免。
2.1 分析
在我们企业中采用Domino的B/S架构进行开发和应用,要解决数据库数据量快速膨胀问题,同时不增加开发难度,本文对数据库的存储、读取以及安全控制等进行分析。
(1)Domino的安全控制是分层的,只有通过对服务器、数据库、文档以及域的正确授权才能正常访问信息。因此分库后的新库,要与原数据库的访问权限、文档的授权方式保持一致,才能保证用户正常访问数据库,保障文档的个性化授权可用。
(2)Domino的Web应用是把设计元素转换成浏览器能够运行的标准的HTML进行展示;在存储时,服务器获取前端表单控件中的数据,与后端表单中的域对应,然后按照后端表单的设计方式存储在数据库里。因此,分库后必须按照这种方式进行访问和存储。
(3)Domino数据库的膨胀是由文档附件、文档域过多引起的。控制域的数量、不保存附件,然后定期进行压缩处理,在同等文档数的情况下,数据库年膨胀率仅为10%左右。
2.2 设计
经过以上两个方面的分析后,结合实际的应用经验建立了如图1所示的应用框架。这个框架中包括Index库(访问入口库)、模板库和运行时的文档库。
(1)以Index库作为访问入口,负责根据配置文档所记录的文档库名跳转到文档库访问真正的文档;建立定时代理检测配置文档的分库阈值与当前文档库的尺寸对比,超出则根据模板新建一个文档库,用新库名替换配置文档中所存储的库名;Index库必须建立用于文档分类、全文索引等所需的设计元素。
(2)建立文档库模板,在档库模板中创建必需的设计元素以及回写代理,并对模板进行必要的用户访问权限配置。
(3)在文档库中创建文档时,回写代理要把文档权限写回到与之对应的Index库中的文档里,保证文档权限的访问正确性。
2.3 功能实现
2.3.1 Index(访问入口库)
(1)建立一个表单,表单里放置subject、creatdate、category等用于存储应用数据的域,放置reader、author等用于安全控制的安全域,同时放入内置HTML,内容为
“计算的值”设置为URL域。
(2)建立数据库简要表,保存文档库的数据库名称,主要代码如下:
Set proDoc = thisDb.GetProfileDocument(thisDoc.F_Form(0))
Call thisDoc.RemoveItem("F_Form")
Call thisDoc.CopyAllItems(proDoc,True)
Call DocumentSave(proDoc,"",True)
(3)建立定时检测代理,检测文档数据库的大小,与设定值比较,超过设定值则建立新库,主要代码如下:
Set prodoc = db.GetProfileDocument("FM_Configure")
DocDBName=prodoc.DDName(0)’简要表中保存的文档数据库名
DocDSize=prodoc.DDSize(0)’简要表中保存的文档数据库大小阈值
DocDtemplete=prodoc.DDtemplete(0)’简要表中保存的文档数据库模板名
Set db = ss.GetDatabase("","DocDBName") if db.size>=DocDSize then‘判斷文档库尺寸是否大于等于设定的值
Dim template As New NotesDatabase( "",DocDtemplete)
Dim NewDb As NotesDatabase
newDBName=DocDBName str(now)
Set NewDb=template.CreateFromTemplate("",newDBName,True)
prodoc.DDName=newDBName
Call DocumentSave(proDoc,"",True)
end if
(4)用Domino的视图和关联表单创建概览,在关联表单的WebQueryOpen事件中加入获取文档数据名称,并保存在表单的DocDName域里。概览视图的“创建”按钮中加入如下Js代码
path=path.substring(0,path.indexOf("Index数据库名") 4) document.DocDName.value "/文档库中的文档表单名?openForm";
window.open(path);
这样就能打开文档库中的表单来创建文档。
2.3.2 模板库
(1)根据实际文档录入、展示的需要建立文档表单以及表单里的所有设计元素。
(2)在表单中创建操作按钮:保存、编辑、修订等。保存按钮调用保存代理,代理执行流程如图2所示。
创建主文档保存后,要重新加载该文档,这样才能获得这个文档的ID。URL的格式为:http://域名/当前库名.nsf/0/文档库当前文档id?opendocument。文档库中的文档与Index的文档(主文档)用文档库中的文档ID进行关联,执行一些相关联的操作等,主要代码如下:
Call DocumentSaveEx(doc,"",True,True)’保存正式文档
Call Sav_ReloadDoc(doc)’重新加载文档
Set newDoc=viewnew.GetDocumentByKey(StrKey,True)’用保存在StrKey中的正式文档ID查找主文档
If newDoc Is Nothing Then ’如果主文档不存在
Set newDoc = dbnew.CreateDocument
newDoc.Form="FDocNew"’用Index库中的访问入口表单创建文档
newDoc.Subject=doc.Subject’把正式文档的相关域值赋给入口表单
…
…
newDoc.F_Author=doc.F_Author
newDoc.F_Reader=doc.F_Reader’把正式文档权限域值赋给入口文档,使两个文档的权限一致
Call newDoc.Save(True,True)’保存入口文档
else
同样的方式更新所有域值
end if
2.4 应用实例
这种分库方式在系统的规章制度模块进行了应用。规章制度模块是行政管理的主要内容之一,按照绩效考核的要求,每年各个部门要提交大量的管理文档及文档附件,数据库的年膨胀速度为20G左右。
应用这项技术时,该模块中已经存在大量的老文档。为了兼容老文档的浏览、查询,在建立一个入口文档表单的同时,需要创建一个视图。这个视图选择两个创建文档的表单,一个是老文档表单,另一个是入口文档表单。这样,以上介绍的技术就能够全面应用,不需要做大的改动,实际应用界面展示了一个从入口库到文档库的访问过程。
应用这项技术后,原库的文档量在不断增加,而库的膨胀速度却得到了控制,经过近8个月的观察,入口数据库的膨胀量仅为400M多一点,分库很及时,创建、访问文档很顺畅,达到了分库的目的,解决了数据库膨胀过快的问题。
3 结束语
随着企业信息化的不断深入,信息量也在不断增大,在Domino环境下运行应用模块,都面临数据库膨胀的问题。在合理设计单文档的存储结构,安全保护附件内容的情况下,“附件”文件系统保存,辅助本文所讨论的自动分库技术,从实际应用效果来看,能够解决大部分非结构化数据库膨胀过快的问提。从实现技术看,本文只讨论了Domino的LS实现方法。如果转换成Java技术来实现,配合Domino提供的DIIOP服务,运行效率会进一步提升,应用范围也将进一步扩大。
主要参考文献
[1]李宁.Notes数据库与关系型数据库之间的整合在办公自动化系统中的应用[J].数字技术与应用,2011(8)
[2]郭健.Lotus文件管理系统的应用研究[J].计算机工程应用技术,2012(7).
[关键词] 分库;入口库;文档库;代理
doi : 10 . 3969 / j . issn . 1673 - 0194 . 2013 . 15. 035
[中图分类号] TP317.1 [文献标识码] A [文章编号] 1673 - 0194(2013)15- 0054- 03
在大庆油田协同办公领域,基于Domino的B/S架构应用了许多年,随着协同办公系统在油田应用的深入,各类业务数据不断增长,Domino数据库不断膨胀,甚至超过最大64G的限制。当数据库里数据达到一定程度后,数据库读、写性能明显下降,以至于会影响整个应用系统的性能。虽然Domino本身提供归档等功能,但只能在一定程度上缓解数据库膨胀问题。对于要求一直在线访问的数据,并且数据量增长迅速的应用,归档则无能为力。本文主要讨论在Domino平台上,充分利用其开发和应用方面的特性,结合以往的实际经验,实现一种能够根据设定的数据量自动分库,同时对应用透明的功能。
1 Domino平台简介
Domino是一个群件平台,提供了一个简化的、高安全性的实时工作环境,版本由4.X到8.X,平台功能不断升级和增强。在企业中利用其强大的业务应用、协作应用和通讯应用,能快速开发行政办公、业务管理以及个人事务处理等系统,提高了员工的工作效率,简化了业务流程,提高了企业业务的响应能力。
2 设计实现
进行基于Domino的应用开发,主要使用Domino的数据库对象。数据库对象集数据存储、表单、视图、代理等于一身,应用的开发可以使用一个或多个数据库。为了降低开发难度,提高开发效率,大多选择一个数据库进行应用开发。因此,数据和设计元素都存储在这个数据库中,库数据量的膨胀就不可避免。
2.1 分析
在我们企业中采用Domino的B/S架构进行开发和应用,要解决数据库数据量快速膨胀问题,同时不增加开发难度,本文对数据库的存储、读取以及安全控制等进行分析。
(1)Domino的安全控制是分层的,只有通过对服务器、数据库、文档以及域的正确授权才能正常访问信息。因此分库后的新库,要与原数据库的访问权限、文档的授权方式保持一致,才能保证用户正常访问数据库,保障文档的个性化授权可用。
(2)Domino的Web应用是把设计元素转换成浏览器能够运行的标准的HTML进行展示;在存储时,服务器获取前端表单控件中的数据,与后端表单中的域对应,然后按照后端表单的设计方式存储在数据库里。因此,分库后必须按照这种方式进行访问和存储。
(3)Domino数据库的膨胀是由文档附件、文档域过多引起的。控制域的数量、不保存附件,然后定期进行压缩处理,在同等文档数的情况下,数据库年膨胀率仅为10%左右。
2.2 设计
经过以上两个方面的分析后,结合实际的应用经验建立了如图1所示的应用框架。这个框架中包括Index库(访问入口库)、模板库和运行时的文档库。
(1)以Index库作为访问入口,负责根据配置文档所记录的文档库名跳转到文档库访问真正的文档;建立定时代理检测配置文档的分库阈值与当前文档库的尺寸对比,超出则根据模板新建一个文档库,用新库名替换配置文档中所存储的库名;Index库必须建立用于文档分类、全文索引等所需的设计元素。
(2)建立文档库模板,在档库模板中创建必需的设计元素以及回写代理,并对模板进行必要的用户访问权限配置。
(3)在文档库中创建文档时,回写代理要把文档权限写回到与之对应的Index库中的文档里,保证文档权限的访问正确性。
2.3 功能实现
2.3.1 Index(访问入口库)
(1)建立一个表单,表单里放置subject、creatdate、category等用于存储应用数据的域,放置reader、author等用于安全控制的安全域,同时放入内置HTML,内容为
“计算的值”设置为URL域。
(2)建立数据库简要表,保存文档库的数据库名称,主要代码如下:
Set proDoc = thisDb.GetProfileDocument(thisDoc.F_Form(0))
Call thisDoc.RemoveItem("F_Form")
Call thisDoc.CopyAllItems(proDoc,True)
Call DocumentSave(proDoc,"",True)
(3)建立定时检测代理,检测文档数据库的大小,与设定值比较,超过设定值则建立新库,主要代码如下:
Set prodoc = db.GetProfileDocument("FM_Configure")
DocDBName=prodoc.DDName(0)’简要表中保存的文档数据库名
DocDSize=prodoc.DDSize(0)’简要表中保存的文档数据库大小阈值
DocDtemplete=prodoc.DDtemplete(0)’简要表中保存的文档数据库模板名
Set db = ss.GetDatabase("","DocDBName") if db.size>=DocDSize then‘判斷文档库尺寸是否大于等于设定的值
Dim template As New NotesDatabase( "",DocDtemplete)
Dim NewDb As NotesDatabase
newDBName=DocDBName str(now)
Set NewDb=template.CreateFromTemplate("",newDBName,True)
prodoc.DDName=newDBName
Call DocumentSave(proDoc,"",True)
end if
(4)用Domino的视图和关联表单创建概览,在关联表单的WebQueryOpen事件中加入获取文档数据名称,并保存在表单的DocDName域里。概览视图的“创建”按钮中加入如下Js代码
path=path.substring(0,path.indexOf("Index数据库名") 4) document.DocDName.value "/文档库中的文档表单名?openForm";
window.open(path);
这样就能打开文档库中的表单来创建文档。
2.3.2 模板库
(1)根据实际文档录入、展示的需要建立文档表单以及表单里的所有设计元素。
(2)在表单中创建操作按钮:保存、编辑、修订等。保存按钮调用保存代理,代理执行流程如图2所示。
创建主文档保存后,要重新加载该文档,这样才能获得这个文档的ID。URL的格式为:http://域名/当前库名.nsf/0/文档库当前文档id?opendocument。文档库中的文档与Index的文档(主文档)用文档库中的文档ID进行关联,执行一些相关联的操作等,主要代码如下:
Call DocumentSaveEx(doc,"",True,True)’保存正式文档
Call Sav_ReloadDoc(doc)’重新加载文档
Set newDoc=viewnew.GetDocumentByKey(StrKey,True)’用保存在StrKey中的正式文档ID查找主文档
If newDoc Is Nothing Then ’如果主文档不存在
Set newDoc = dbnew.CreateDocument
newDoc.Form="FDocNew"’用Index库中的访问入口表单创建文档
newDoc.Subject=doc.Subject’把正式文档的相关域值赋给入口表单
…
…
newDoc.F_Author=doc.F_Author
newDoc.F_Reader=doc.F_Reader’把正式文档权限域值赋给入口文档,使两个文档的权限一致
Call newDoc.Save(True,True)’保存入口文档
else
同样的方式更新所有域值
end if
2.4 应用实例
这种分库方式在系统的规章制度模块进行了应用。规章制度模块是行政管理的主要内容之一,按照绩效考核的要求,每年各个部门要提交大量的管理文档及文档附件,数据库的年膨胀速度为20G左右。
应用这项技术时,该模块中已经存在大量的老文档。为了兼容老文档的浏览、查询,在建立一个入口文档表单的同时,需要创建一个视图。这个视图选择两个创建文档的表单,一个是老文档表单,另一个是入口文档表单。这样,以上介绍的技术就能够全面应用,不需要做大的改动,实际应用界面展示了一个从入口库到文档库的访问过程。
应用这项技术后,原库的文档量在不断增加,而库的膨胀速度却得到了控制,经过近8个月的观察,入口数据库的膨胀量仅为400M多一点,分库很及时,创建、访问文档很顺畅,达到了分库的目的,解决了数据库膨胀过快的问题。
3 结束语
随着企业信息化的不断深入,信息量也在不断增大,在Domino环境下运行应用模块,都面临数据库膨胀的问题。在合理设计单文档的存储结构,安全保护附件内容的情况下,“附件”文件系统保存,辅助本文所讨论的自动分库技术,从实际应用效果来看,能够解决大部分非结构化数据库膨胀过快的问提。从实现技术看,本文只讨论了Domino的LS实现方法。如果转换成Java技术来实现,配合Domino提供的DIIOP服务,运行效率会进一步提升,应用范围也将进一步扩大。
主要参考文献
[1]李宁.Notes数据库与关系型数据库之间的整合在办公自动化系统中的应用[J].数字技术与应用,2011(8)
[2]郭健.Lotus文件管理系统的应用研究[J].计算机工程应用技术,2012(7).