【转】From 涂曙光‘s PPT in "Techend" : 关于SharePoint的代码优化 – 获取列表数据
2007-11-22 14:50 拖鞋不脱 阅读(601) 评论(0) 编辑 收藏 举报
会造成什么后果?
应用程序池频繁进行回收/重启操作
访问量一多,站点就明显变慢很多
访问量一多,站点就常出现“超时错误”、“页面不可用”等错误
SPLisst with For/Each
SPList with SPQuery
SPList with DataTable
SPListItem with DataTable
List with Web Service
Search
PortalSiteMapProvider
SPSite / SPWeb
当创建它们的实例对象时,会使用非托管资源
每个实例对象会占用 1-2 MB 内存
它们都实现了 IDisposable 接口 !
会造成什么后果?
应用程序池频繁进行回收/重启操作
访问量一多,站点就明显变慢很多
访问量一多,站点就常出现“超时错误”、“页面不可用”等错误.
不好的习惯
好的习惯
应用程序池频繁进行回收/重启操作
访问量一多,站点就明显变慢很多
访问量一多,站点就常出现“超时错误”、“页面不可用”等错误
SPLisst with For/Each
SPListItemCollection items = list.Items;
foreach (SPListItem item in 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
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
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(…);
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
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
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
当创建它们的实例对象时,会使用非托管资源
每个实例对象会占用 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(); } } }
{ using (SPWeb web = site.OpenWeb(“MyWebSite/MySubSite”))
{ foreach (SPWeb sWeb in site.GetSubWebsForCurrentUser()) { … sWeb.Dispose(); } } }
联系我
关注SQL、.Net、Silverlight、网页设计。