zoukankan      html  css  js  c++  java
  • sharepint开发过程的一些性能总结

    1. 取得列表中的Item的数量:

    Int count = SPContext.Current.List.Items.Count;

    这句是取得Item的数目,不得不取得列表中的所有的Item的metadata,这样我们程序运行的速度就会相对慢一些,如果列表中的数据量不大,那不会有明显的影响,如果列表中的数据量很大,那在效率上会有很大的影响。

    Int count = SPContext.Current.List.ItemCount;//建议使用这个来取得列表中的item数量。

    2. 显示列表中的item

    SPList list = SPContext.Current.List;
    
    For(int i=0;i<50;i++)
    
    {
    
        SPListItem listItem = list.Items[i];
    
    }

    这样每次都会请求SPListItemCollection集合的新的对象,而使item集合对象没有被缓存。因此不断的从数据库请求所有的数据项,对性能上造成很大的影响。

    建议的方法是:

    SPListItemCollection item = SPContext.Current.List.Items;
    
    For(int i=0;i<50;i++)
    
    {
    
        SPListItem item = items[i];
    
    }

    3. 取得item对象

    SPListItem item = SPContext.Current.List.Items[0];

    这句主要是从list中先取得对象的所有的Item的Metadata,然后再从这些Item的集合中取得到index是0的Item

    建议使用下面语句进行取得Item对象:

    SPListItem item = SPContext.Current.List.GetItemById(0);

    两句SDK执行的区别就是我们使用SQL语句进行查询的时候,第一没有设置where子句的条件,而第二句则是设置了where子句的条件,在数据量很大的情况下,这样第二句执行的速度会远远大于第一句执行的速度。

    4. 更新大量的SharePoint 列表数据项

    For(int itemIndex=0;itemIndex<100;itemIndex++)
    {
        SPListItem newItem = items.Add();
        newItem.Update();
    }

    实际上item的Add 或是Update方法是调用了一个存储过程,来完成这个操作的。

    如果需要大量的数据更行的使用建议使用SPWeb的ProcessBatchData方法进行更新。具体实例如下:

    SPContext.Current.Web.ProcessBatchData(queryString);

    5. 取得SharePoint的列表对象

    SPList list = SPContext.Current.Web.Lists[title];

    这句取得列表对象先从站点中取得所有的List的Metadata和title进行比较,找到符合条件的list之后返回。

    建议使用下面的方法取得列表对象:

    SPList list = SPContext.Current.Web.GetList(listUrl);或

    SPList list = SPContext.Current.Web.GetListByUrl(listUrl);

    6. 如果遇到字符串拼接,我们通常使用StringBuilder,而不是直接使用字符串直接的链接

    字符串直接的链接需要的内存量很大,效率很低。建议方法如下:

    StringBuilder msgString = new StringBuidler();
    xmlString.Append(“message1”);
    xmlString.Append(“message1”);
    string message = msgString.ToString();

    不建议使用的方法是:

    String message = “message1”+”message2”;

    特别是在消息字符串很长的情况下。程序运行的效率相当的低。

    7. SharePoint中有一些对象是非托管的对象,所以需要我们手动进行释放,防止内存泄漏。

    例如:SPSite,SPWeb等等其他一些对象。但是需要注意的是我们如果使用全局的SPWeb,就不应该进行释放,例如:SPContext.Current.Web就是一个全局的Web对象,当我们使用这个对象的时候,我们不应该把这个对象进行Dispose。

    一般的释放非托管对象的方法有两种:

    (1) try ---catch---finally

    SPSite site = null;
    Try
    {
       Site = new SPSite(“http://server:80”);
    }
    Catch(Exception er)
    {
       //TODO:
    }
    Finally
    {
      If(site != null)
      {
         Site.Dispose();
      }
    }

    (2) using

    using(SPSite site = new SPSite(“http://server:80”))
    {
       //TODO
    }

    8. 字符串的比较操作

    在比较的时候我们应该注意是否忽略大小写,这个地方是很容易出现问题的地方。

    String name1 = “A”;
    String name2 = “a”;
    Bool flag = name1.Equals(name2);// flag 是false
    Bool flag = name1.Equals(name2, StringComparison.OrdinalIgnoreCase);//flag 是true

    9. 在SharePoint中我们要设置folder的权限,首先我们要打破原有的继承的权限,但是这里有一个问题需要注意一下:

    如果使用folder.Item.BreakRoleInheritance(false)的时候会抛出一个异常,原因是SharePoint API中原有这个问题。我们解决这个问题通常使用folder. Item.BreakRoleInheritance(true);然后我们在删除掉他原有的权限。这样操作之后再给这个folder赋予新的权限即可。

    10. 保持程度的可读性

    (1) 在程序中最好不要多次使用return , 尽量在程序结束或是我们的逻辑完成的时候进行return例如:

    If(testValue == 1)
    {
       Return 1;
    }
    Else if(testValue == 2)
    {
       Return 2;
    }
    
    …….

    建议使用如下方法:

    Int returnValue =0;
    If(testValue ==1)
    {
       returnValue = 1;
    }
    Elseif(testValue ==2)
    {
       returnValue = 2;
    }
    ……
    Return returnValue;

    (2) 在程序中尽量不要使用GoTo语句,使用GoTO语句使程序非常的不可读,可能之后编写程序的人才懂程序的意思,其他人根本看不懂程序是完成什么功能的,还有可能时间长了,编写程序的人自己也不懂具体是什么意思了,这样会非常糟糕,不利于以后的扩展和维护。

    11. 判断字符串是否为空串,应该尽量使用下面方法:

    String message = “123”;

    Bool flag = string.IsNullOrEmpty(message);

    我们在初始化一个空字符串的时候,应该尽量使用如下方法:

    String str1 = string.Empty;

    尽量不要使用 string str2 = “”;

    因为这两种内存分配的方式,是不同的,C#内部处理的机制也是不相同的。

    12. 注意C#中的拆箱和装箱问题

    在编程实践中我们如果使用List<T> lists = new List<T>();,能够解决的问题,最好不要使用ArrayList和Hashtable等集合,因为ArrayList、Hashtable这样的集合会存在拆箱和装箱问题,占用程序很大的性能,如果数量过多会严重影响性能。

    13. SharePoint中的非托管对象需要我们手动释放资源
    SPGlobalAdmin、SPSite、SPWeb、SPFileStream等等一些对象需要进行手动释放资源。由于SharePoint中有这些非托管对象,所以我们编程的时候应该特别注意,如果有些资源没有释放,会造成内存溢出。并且很多时候我们自定义的程序是由IIS调用的,如果没有释放资源,可能会是IIS 崩溃,造成不必要的麻烦。


    14. SharePoint中不能上传大小为0 KB的文件,由于SharePoint上传文档的时候会将这个文件的内容一并写进数据库的Content字段,如果文件的大小是0,则这个byte [] 将没有内容,所以不会成功。如果我们要对0KB的文件进行上传的话,我们需要使用程序进行特殊处理:
    一是可以在这个文件中添加我们的标识信息,当取得其中的内容的时候我们也可以将标识信息去掉,然后就是内容信息。或者使用API也是可以处理添加0 KB 文件的。或者使用Explorer View进行上传也可以上传大小为0 KB的文件。

    15. 当SharePoint中list打开Version开关的时候,我们可以对文档的操作进行使用版本控制,并且可以根据不同时间的修改产生的不同的version来取得不同version的文档。在这里下载不同的version的文档有不同的地址,我们可以根据version来计算这个文档的地址。如果打开Major Version的时候version会按照1.0、2.0、、、递增,如果是打开Major和Minor Version的时候version会按照0.1、0.2、、、递增,当前的也就是version最大的文档的地址是正常的,历史的version的文档的地址是不同的,在站点url后面加上_vti_history/version的个位*512 + 小数点后的数字/文档url。


    16. SharePoint中的内存泄漏问题
    (1) 当使用 list.ParentWeb,或folder.ParentWeb 等等只要使用这个ParentWeb属性,那么这个ParentWeb是需要释放的。
    (2) 同样道理,我们只要使用了web.Site属性,那么这个Site对象是需要释放的。
    (3) 我们一般对这两个对象进行释放的时候,都是使用Dispose()方法,其实Dispose()方法内部也只是简单的调用了Close()方法,但是我们还是建议使用Dispose()方法进行释放。这样不会造成一些SharePoint API自身产生的一些错误。

    (4) 使用OpenWeb()方法和SelfServiceCreateSite()方法时都会返回一个SPWeb对象,这些对象都需要进行手动释放。
    (5) 我们使用索引器取得Site或是Web的时候,都需要进行手动释放,因为我们去的了SPWeb和SPSite都会在内存中申请相应的空间,但是由于是非托管的对象所以我们还是以需要进行手动释放的。
    (6) 当我们使用SPSite的LockIssue、Owner、SecondaryContact属性的时候,会隐式的调用RootWeb属性,所以我们需要对这个RootWeb对象进行释放。

    作者:spring yang

    出处:http://www.cnblogs.com/springyangwc/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
    posted @ 2011-08-03 23:13 spring yang 阅读(4571) 评论(5) 编辑
     
     

    概要

    在sharepoint中的自定义web part会涉及到对list里面的item进行操作,这篇文单将会讲解如何修改list里的item。

    我们先看一个示例

            /// <summary>
            /// 
            /// </summary>
            /// <param name="ID"></param>
            /// <returns></returns>
            public SPListItemCollection GetSPListItemCollection(string ID)
            {
                SPListItemCollection itemCollection = new SPListItemCollection();
                SPSecurity.RunWithElevatedPrivileges(
                        delegate
                        {
                            using (SPSite spsite = new SPSite(this.CurrentUrl))
                            {
                                using (SPWeb spWeb = spsite.OpenWeb())
                                {
                                    SPList listInstance = spWeb.Lists[this.ListName];
                                    SPQuery query = new SPQuery();
                                    query.Query = "<Where><Eq><FieldRef Name='ID' /><Value Type='Counter'>" + ID + "</Value></Eq></Where>";
                                    itemCollection = listInstance.GetItems(query);
    
                                }
                            }
                        }
                    );
                return itemCollection;
            }

    SPSecurity.RunWithElevatedPrivileges()是用来提高操作权限级别来操作站点!

    用法:

    SPSecurity.RunWithElevatedPrivileges(delegate() {代码});提高权限将是让代码以sharepoint\system所具有的权限来执行!

    更改指定的item代码

            public string AddNewItem()
            {
                string retVal = string.Empty;
                try
                {
                    SPSecurity.RunWithElevatedPrivileges(delegate()
                    {
                        using (SPSite site = new SPSite(SPContext.Current.Web.Url))
                        {
                            using (SPWeb web = site.OpenWeb())
                            {
                                SPList list = web.Lists["TEST"];
                                SPListItem item = list.Items.Add();
                                item["Title"] = string.Format("Test at {0}", DateTime.Now.ToString());
                                item.Update();
                            }
                        }
                        retVal = "operation  success!";
                    });
                }
                catch (Exception ex)
                {
                    retVal += ex.Message;
                }
                return retVal;
            }

    如果修改的不留痕迹,要使用SystemUpdate;

    示例如下:

            public string AddNewItem()
            {
                string retVal = string.Empty;
                try
                {
                    SPSecurity.RunWithElevatedPrivileges(delegate()
                    {
                        using (SPSite site = new SPSite(SPContext.Current.Web.Url))
                        {
                            using (SPWeb web = site.OpenWeb())
                            {
                                SPList list = web.Lists["TEST"];
                                SPListItem item = list.Items.Add();
                                item["Title"] = string.Format("Test at {0}", DateTime.Now.ToString());
                                item.SystemUpdate();
                            }
                        }
                        retVal = "operation  success!";
                    });
                }
                catch (Exception ex)
                {
                    retVal += ex.Message;
                }
                return retVal;
            }

    在很多时候我们需要设置允许不安全的修改。使用这个AllowUnsafeUpdates.

    示例如下:

            public string AddNewItem()
            {
                string retVal = string.Empty;
                try
                {
                    SPSecurity.RunWithElevatedPrivileges(delegate()
                    {
                        using (SPSite site = new SPSite(SPContext.Current.Web.Url))
                        {
                            using (SPWeb web = site.OpenWeb())
                            {
                                web.AllowUnsafeUpdates = true;
                                SPList list = web.Lists["TEST"];
                                SPListItem item = list.Items.Add();
                                item["Title"] = string.Format("Test at {0}", DateTime.Now.ToString());
                                item.SystemUpdate();
                                web.AllowUnsafeUpdates = false;
                            }
                        }
                        retVal = "operation  success!";
                    });
                }
                catch (Exception ex)
                {
                    retVal += ex.Message;
                }
                return retVal;
            }

    在sharepoint里面删除一条item的话可以进行如下操作.

            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            private SPList GetCurrentList()
            {
                using (SPSite siteCollection = new SPSite(SPContext.Current.Web.Url))
                {
                    using (SPWeb web = siteCollection.OpenWeb())
                    {
                        SPList list = web.Lists[this.ListName];
                        return list;
                    }
                }
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="id"></param>
            /// <param name="version"></param>
            /// <param name="recycle"></param>
            public void DeleteItemByIDVersion(int id, int version, bool recycle)
            {
                SPListItem item = GetCurrentList().GetItemById(id);
                if (recycle)
                {
                    item.Versions.GetVersionFromID(version).Recycle();
                }
                else
                {
                    item.Versions.GetVersionFromID(version).Delete();
                }
            }
    
    
            /// <summary>
            /// Property that holds the list name.
            /// </summary>
            public override string ListName
            {
                get { return "Test"; }
            }

    如果只取item的发布过的版本的数据,可以做如下处理.

            private NewEntity GetLastApproveVersionByItem(SPListItem item)
            {
                NewEntity result = null;
                if (item == null) return result;
                if (item.Level == SPFileLevel.Published)
                {
                    result = this.ConvertToEntity(item);
                }
                else if (item.Versions != null && item.Versions.Count > 0)
                {
                    foreach (SPListItemVersion itemVersion in item.Versions)
                    {
    
                        if (itemVersion.Level == SPFileLevel.Published)
                        {
                            result = this.ConvertToEntity(itemVersion);
                            break;
                        }
                    }
                }
                return result;
            }

    总结

    sharepoint 对list的操作,主要有增加、删除和修改list里面的item数据,要注意的是这里打开的是当前操作的site。SPContext.Current.Web.Url取的是当前打开页面的值.

    作者:spring yang

    出处:http://www.cnblogs.com/springyangwc/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    【最短路】The 2019 Asia Nanchang First Round Online Programming Contest Fire-Fighting Hero (Dijkstra)
    【积累】The 2019 Asia Nanchang First Round Online Programming Contest The Nth Item (矩阵快速幂 k进制快速幂)
    【线段树】The Preliminary Contest for ICPC Asia Xuzhou 2019 Colorful String(回文树+线段树+状压/bitset)
    allure参数说明及代码示例
    Idea+maven+testng+reportng生成测试报告
    ubuntu 16.04 镜像下载
    new AndroidDriver报错java.lang.NoSuchMethodError: com.google.common.base.Throwables.throwIfUnchecked
    Appium常用的API
    Appium常用的定位方法
    adb 指令总结
  • 原文地址:https://www.cnblogs.com/dengdengwang/p/2986583.html
Copyright © 2011-2022 走看看