代码改变世界

【转】From 涂曙光‘s PPT in "Techend" : 关于SharePoint的代码优化 – 获取列表数据

2007-11-22 14:50  拖鞋不脱  阅读(601)  评论(0编辑  收藏  举报
会造成什么后果?
应用程序池频繁进行回收/重启操作
访问量一多,站点就明显变慢很多
访问量一多,站点就常出现“超时错误”、“页面不可用”等错误
SPLisst with For/Each
SPListItemCollection items = list.Items;
foreach (SPListItem item in items)
{ … }

SPList with SPQuery
1SPQuery query = new SPQuery;
2query.Query = “<Where></Where>”;
3query.RowLimit = 100;
4SPListItemCollection items = list.GetItems(query);
5

SPList with DataTable
1DataTable table = list.Items.GetDataTable();

SPListItem with DataTable
1SPQuery query = new SPQuery;
2query.Query = “<Where></Where>”;
3query.RowLimit = 100; SPListItemCollection items = list.GetItems(query);
4DataTable table = items.GetDataTable();
5

List with Web Service
WSLists.Lists ws = new WSLists.Lists();
ws. Credentials 
= System.Net.CredentialCache.DefaultCredentials;
ws.Url 
= “http://myPortal/_vti_bin/lists.asmx”;
XmlNode node = ws.GetListItems(…);

Search
1FullTextSqlQuery query = new FullTextSqlQuery(mysite);
2query.QueryText = “SELECT …”;
3query.RowLimit = 100;
4query.ResultTypes = ResultType.RelevantResults;
5ResultTableCollection rtc = query.Execute();
6

PortalSiteMapProvider
 1SPQuery query = new SPQuery;
 2query.Query = “<Where></Where>”;
 3query.RowLimit = 100;
 4
 5PortalSiteMapProvider ps = PortalSiteMapProvider.WebSiteMapProvider;
 6PortalWebSiteMapNode node = (PortalWebSiteMapNode) ps.FindSiteMapNode(myWeb. ServerRelativeUrl);
 7
 8SiteMapNodeCollection items = ps.GetCachedListItemsByQuery(node, “myListName”, query, myWeb);
 9foreach (PortalListItemSiteMapNode item in items)
10{ … }
11


比较结果:

另外关于代码优化,还提到:

及早释放SPSite与SPWeb:
SPSite / SPWeb

当创建它们的实例对象时,会使用非托管资源
每个实例对象会占用 1-2 MB 内存
它们都实现了 IDisposable 接口 !
会造成什么后果?
应用程序池频繁进行回收/重启操作
访问量一多,站点就明显变慢很多
访问量一多,站点就常出现“超时错误”、“页面不可用”等错误.
不好的习惯
SPSite site = new SPSite(“http://Portal”); SPWeb web = site.OpenWeb(“MyWebSite/MySubSite”); foreach (SPWeb sWeb in site.GetSubWebsForCurrentUser()) { … }

好的习惯
using ( SPSite site = new SPSite(“http://portal”) ) 
using (SPWeb web = site.OpenWeb(“MyWebSite/MySubSite”)) 
foreach (SPWeb sWeb in site.GetSubWebsForCurrentUser()) { … sWeb.Dispose(); } } }