|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。SharePoint对象模子(ObjectModel)同意内部使用程序或托管的WebPart来查询、编纂和创立存储在SharePoint内容数据库(ContentDatabase)中的内容。有良多博客文章、常识库文章和最好理论中,都谈到怎样在分歧的用例场景中利用对象模子。
年夜部分罕见用例场景都是关于显现和编纂SharePoint列表的——惋惜,这也是我们看到良多功能成绩呈现的中央,这是由于SharePoint对象模子其实不老是以功能优化的体例被利用。
用例1:在SharePoint列表中,存储了几项目?
有多种体例往返答这个成绩。我已经看到良多次的一个例子是上面如许:- intnoOfItems=SPContext.Current.List.Items.Count;
复制代码 这句代码告知我们在列表中数据项的数量,为了失掉这个了局不能不从内容数据库中猎取列表的一切项目。上面的截图显现了,当下面代码在会见Count属性的时分,对象模子外部的实行历程:
<br>
关于小型列表,这不会有成绩,查询仍是对照敏捷。不外当列表增加数倍,或自界说代码从未在实践数据上测试过的话,这将成为一个成绩。
关于这类情形,微软为SPList供应了别的一个属性,名为ItemCount。准确的代码应当是:- intnoOfItems=SPContext.Current.List.ItemCount;
复制代码 在这类情形下,SharePoint只用在内容数据库中查询Lists数据表的单个纪录。在列表中数据项的数目会被冗余地存储在这,以便无需查询全部AllUserData数据表(一切的SharePoint列表项目都保留在这里)便可取得这个信息。
用例2:利用SPList显现列表中的项目?
经由过程SharePoint对象模子,有多种办法能够遍历SharePoint列表的数据项。我已经在一个实践运转的SharePoint使用程序中见到的如许一个体例——在开辟职员呆板上或在十分小的列表上大概会事情一般,可是一旦在凌驾几百条数据项的列表上实行,这类体例就会呈现致命的功能成绩。让我们看一下代码片断,它被用于一个WebPart中,从以后高低文的SharePoint列表中猎取前100个数据项:- SPListactiveList=SPContext.Current.List;for(inti=0;i<100&&iSPListItemlistItem=activeList.Items[i];htmlWriter.Write(listItem["Title"]);}
复制代码 假定在这个列表中最少有100条数据项——这段代码为了猎取前100个SharePoint列表数据项的100个Title值,会往复会见数据库几次?你大概会很惊奇。经由对上述代码的实行历程的剖析,在你看到来着数据库的视图的时分,一共对数据库举行了200次挪用:
<br>
缘故原由在于,在每次轮回中,当会见Items属性的时分,我们都哀求了一个新的SPListItemCollection对象。Items属性未被缓存,因而老是从数据库中重复不休地哀求一切数据项。上面是第一个轮回迭代的情形:
<br>
准确的办法
准确的办法固然是把Items属性的前往值存储在一个SPListItemCollection变量中。如许,数据库就只会查询一次,而且我们接上去也能够遍历存储在汇合对象内里的了局集。上面是修正后的示例代码:- SPListItemCollectionitems=SPContext.Current.List.Items;for(inti=0;i<100&&iSPListItemlistItem=items[i];htmlWriter.Write(listItem["Title"]);}
复制代码 你也能利用foreach轮回语句,它会被编译为相似的代码,其充实使用了Items汇合的IEnumerable接口。上面是新的轮回在外部怎样被处置的历程:
<br>
用例3:利用SPQuery和SPView只哀求你真正必要的数据
在必需处置来自数据库的数据的任何范例使用程序中,我们都能见到的一个次要功能成绩是,有太多半据要会见。哀求比以后用例所需的数据量更多的信息,会招致分外的:
- 在数据库上的查询开支,以便搜集哀求信息
- 在数据库和使用程序之间的通信开支
- 在数据库和使用程序上的内存开支
转头看一下后面2个用例,你会发明被实行的SQLStatement老是从哀求的SharePoint列表当选取了一切数据项。你能够说你看到SELECT子句是如许誊写:SELECTTOP2147483648……
限定前往行的数目
在会见SharePoint列表中的数据项的时分,万一你只想失掉无限数目的了局集,那末你能够使用SPQuery.RowLimit属性。
上面是一个例子:- SPQueryquery=newSPQuery();query.RowLimit=100;SPListItemCollectionitems=SPContext.Current.List.GetItems(query);for(intitemIx=0;itemIxSPListItemlistItem=items[itemIx];}
复制代码 在SPList.GetItems办法中利用SPQuery对象,将天生包括以下SELECT子句的了局。
<br>
在之前的例子中,我们已限定了想要猎取的数据项数量。但是,我们仍旧仍是哀求了界说在SharePoint列表中的一切列。关于真正必要把一切列都显现给终极用户,大概必要一切列来完成某些盘算的情形,如许做毫无成绩。但是,在年夜部分情形下,我们只必要几个而不是全体的列。
限定检索列
有两种办法来限定哪些列要从数据库检索:
- 利用SharePoint视图:SPView
- 利用SPQuery.ViewFields属性
因而下面的示例代码能够用以下两种体例举行修正:- SPQueryquery=newSPQuery(SPContext.Current.CurrentView.View);
复制代码 或- SPQueryquery=newSPQuery();query.ViewFields="";
复制代码 在两种场景中,SELECT子句都只包括那些界说在SharePoint视图中的字段,这些字段各安闲ViewFields属性中被援用:
<br>
用例4:经由过程SPQuery来对SharePoint列表数据项举行分页
SharePoint列表能包括不计其数的数据项。我们都传闻,为了取得较好的列表功能,不该该凌驾2000条的限制。当凌驾这个限制后,的确存在功能影响。有一些办法能够克制这个限制,就是利用索引列和视图。
在会见列表中的数据时,除思索这些要素外,另有一个方面对照主要。在之前的用例中已注释过——只会见你必要的数据能够年夜年夜下降SharePoint内容数据库的压力。别的,SharePoint对象模子也供应了一些分外的特征来增强会见列表数据项的才能。
数据分页就是个中一个手艺,就是我们在富客户端使用程序或Web使用程序中已熟知的,利用数据网格相似的体例。分页让终极用户便利地导航数据,而且——假如准确地完成的话——能够削减低层数据库的负载。
SPQuery对象供应了属性ListItemCollectionPosition,经由过程它你可以设定查询页的肇端地位。RowLimit让你设定每页要猎取几数据项。让我们来看一些示例代码:- SPQueryquery=newSPQuery();query.RowLimit=10;//thatisourpagesizedo{SPListItemCollectionitems=SPContext.Current.List.GetItems(query);//dosomethingwiththepageresult//setthepositioncursorforthenextiterationquery.ListItemCollectionPosition=items.ListItemCollectionPosition;}while(query.ListItemCollectionPosition!=null)
复制代码 SPList.GetItems实行了这个查询,每次挪用GetItems只前往10条数据项。SPListItemCollection供应的ListItemCollectionPosition属性就像SharePoint列表上的一个指针。这个属功能用于任何页面遍历,以界说下一页的肇端点。上面的插图显现了数据库的举动:
<br>
细心看一下展示给我们的这个SQLStatement,它夹杂了SELECTTOP和WHERE子句,用于猎取某个页的数据项:
<br>
用例5:更新大批的SharePoint列表数据项
之前的用例存眷于存储在SharePoint列表中的数据项的读取会见。如今来会商一下怎样更好地更新或增加新数据项了。因为SharePoint对象模子供应了丰厚的接口,以是我们又能够在多种体例中举行选择了。
在SharePoint列表中增加和更新数据项的第一个不言而喻的体例是,SPListItem.Update。要取得一个列表数据项,既能经由过程查询一个现存数据项,又能够用SPListItemCollection.Add来增加一个新的。
让我们看一下以下的例子:- for(intitemIx=0;itemIx<100;itemIx++){SPListItemnewItem=items.Add();//fillalltheindividualfieldswithvaluesnewItem.Update();}
复制代码 对这段代码举行剖析,我们看到对Update办法的每次挪用实践上都挪用了外部办法SPListItem.AddOrUpdateItem,它现实上是挪用了一个存储历程来完成这个义务:
<br>
我们看到,增加100条数据项到我的列表中,消费了4.5秒的工夫。
利用批量更新取代单个更新
假如你必需更新大批的数据项,激烈倡议你不要在每一个数据项上自力利用Update办法。而是,利用SPWeb供应的批量更新函数ProcessBatchData。
ProcessBatchData实行以XML格局界说的批量办法。这里有一篇很好的文章注释了怎样利用批量更新。经由过程使用批量更新,能够把下面的例籽实现为如许:- StringBuilderquery=newStringBuilder();for(intitemIx=0;itemIx<100;itemIx++){query.AppendFormat(""+"{1}"+"New"+"Save"+"{2}"+"",itemIx,listGuid,someValue,"urn:schemas-microsoft-com:office:office#");}SPContext.Current.Web.ProcessBatchData(""+"{0}",query.ToString())
复制代码 经由过程ProcessBatchData增加一样的100条数据项,经由过程剖析外部机理,我们晓得在更新过程当中消费了几工夫:
<br>
两种更新体例的对照标明,我们能够经由过程批量更新来取得伟大的功能提拔:
<br>
注重
批量更新实践上只在实行大批更新的时分才被保举。不外,请思索一下创立批量更新XML的花消:
- 确保利用StringBuilder,而不是把一些自力字符串对象毗连在一同。
- 支解批量更新挪用,以坚持天生的XML充足小,不会呈现内存溢出非常。在实行上述包括了50000个批量更新的例子的时分,我就碰到了OOM(内存溢出)。
用例6:哪个是我最慢的列表,它们怎样被利用和为何会慢?
我们晓得,SharePoint列表功能跟着存储在个中的数据项的数目增添而下降,而且也和显现的时分,列表怎样举行过滤有关。你能够找到谈及每一个列表2000条数据项限制的良多文章和博客帖子。
为了做准确的事取得优秀的功能,起首必要懂得以后的利用情形并剖析功能成绩。
有几种体例能够算出你的SharePoint使用程序确当前会见统计量。你能够剖析IIS日记文件,大概利用SharePoint利用率呈报特征(SharePointUsageReportingFeature)。
监测列表功能最复杂的体例就是剖析各个SharePointList和SharePointView的URL的HTTP呼应次数。SharePointURL的格局相似如许:http://servername/site/{LISTNAME}/{VIEWNAME}.aspx。
为了剖析它,我们能够基于这两个标志来对哀求举行分组。我利用dynaTrace的BusinessTransaction特征按照正则表达式来分组捕捉到的PurePath"s。
<br>
如许的了局让我们分明,哪些列表和视图利用最频仍,它们体现怎样。
别的,对HTTP哀求举行剖析——它只为那些显现特定列表或视图的页面供应正确的数据——如许,我们就可以剖析自界说Web部件或自界说页面的列表利用率,它们常常比单个列表或视图被会见得更多,也比那些以特定过滤体例来会见列表的情形多。
我们也能剖析与SharePoint对象模子交互的情形,好比被用于出现列表和视图的SPRequest.RenderViewAsHtml的利用情形,对SPList和SPView的会见情形。上面的插图显现了对SPRequest办法挪用的利用率和功能目标:
<br>
下面的插图给我们展示了,列表的外部GUID。每一个列表和视图都经由过程GUID来独一标识。这是查找实在列表称号的别的一种体例:你能够吧GUID粘贴进URL中,以编纂列表和视图的设置。上面是一个例子:- intnoOfItems=SPContext.Current.List.ItemCount;0
复制代码 这为我们供应了别的一种翻开内容数据库和查询AllLists数据表的体例。这个数据表包括着GUID和List称号。
列表为何慢?
如今,因为我们已晓得哪些列表和视图被频仍会见,我们就可以重点存眷那些让功能下落的中央。为了改良终极用户体验,我们应当会合在最频仍会见的列表上,而不是那些偶然会见一下的列表。
列表体现迟缓,存在有多种缘故原由:
- 有太多的数据项显现在列表视图中
- 有太多的数据项保留于没有过滤和索引列的列表中
- 自界说Web部件举行了有效率的数据会见
Conclusion
SharePoint对象模子供应了一种轻松的天真的体例来扩大SharePoint使用程序。这个框架供应了分歧的机制来会见和编纂存储在SharePoint列表中的数据。但是,不是每种大概的体例关于每一个用例场景都是可取的。懂得SharePoint对象模子的外部道理可让我们创立的SharePoint使用程序运转得更好,功能更容易伸缩。
关于作者
AndreasGrabner作为一个手艺计谋决议者,事情于dynaTraceSoftware。他的脚色回属R&D部门,影响着dynaTrace产物决议,并和关头客户严密合作,为全部使用程序性命周期完成了功能办理办理计划。AndreasGrabner在Java和.NET范畴具有10年的构架和开辟履历。
关于作者的店主:dynaTracesoftware
dynaTrace是为实行关头营业的Java和.NET使用程序的全部性命周期,供应延续使用程序功能办理办理计划的向导者。dynaTrace为一切关头好处相干人(开辟、测试和产物)供应通用的、集成的功能办理平台的最好办理计划。诸如UBS、LInkedIn、EnerNOC、Fidelity和ThomsonReuters如许的行业首脑,都是利用dynaTrace正在请求专利的手艺,以期取得对使用程序功能完整的掌控、尽早地辨认成绩,并极年夜地削减了均匀修复工夫(削减了90%)。这些和其他一些向导厂商依附于dynaTrace的手艺,主动避免突发的功能成绩,并在呈现的时分疾速办理它们——节俭了工夫、款项和资本。
检察英文原文:SharePointObjectModelPerformanceConsiderations.
来自:http://www.infoq.com/cn/articles/SharePoint-Andreas-Grabner
什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的) |
|