摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复263或者20170828可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me 。

项目升级到Dynamics 365以后,过了些时间,有的账号反馈使用很慢,甚至同一个地方同一台电脑用不同的账号特别是进行数据修改的时候会发现有明显的速度差别,Why?

初步的表象发现是POST 到这个请求 /AppWebServices/InlineEditWebService.asmx 比较慢,这个是系统标准的东西,就算是有问题,我们能做的可能也有限。奇怪的是我们使用同样业务部门同样角色的账号处理类似单据的时候并不能重现此问题,而且通过SQL Profiler抓取的SQL执行语句也没有发现执行时间很长的SQL。

有问题就有解决问题的方法,大神们日夜分析,发现卡顿的主要原因是执行部分SQL后会卡顿,等待然后再执行,这样导致的总体时间很长,整个过程甚至能超过20秒。再次详细分析,发现每次这个卡顿都会又一次查询 BusinessProcessflowInstanceBase 这个表,奇怪啊,我们并没有使用业务流程。后来微软技术支持中心向更加广泛的范围求助,终于找到答案,原来是Dynamics 365开始,CRM中的一条记录可能有多个活动业务流程,每个人根据其权限等显示的业务流程又不尽相同。所以会查询这个表,当然在查询这个表之前会先查询这条记录相关的MRU(Most Recently Used List,最近访问列表),但是如果这个MRU非常大,就会非常耗时导致等待。

那么这么MRU怎么看?当然你可以通过SQL直接来看,这个MUR跟用户和实体的Typecode有关,下面是查看某个用户的所有MRU:

 select ueus.RecentlyViewedXml,
len(ueus.RecentlyViewedXml) as RecentlyViewedXmlLength,
sysuser.FullName,
entity.LogicalName
from UserEntityUISettings ueus
left join SystemUserBase sysuser on ueus.OwnerId = sysuser.SystemUserId
left join entity on ueus.ObjectTypeCode = entity.ObjectTypeCode

我看到我这个账号经常使用ly_test这个实体,发现其RecentlyViewedXml大小也有 8832 字节,如果你用的狠的话,这个数字可能会超过1Mb。这个里面的内容我简化下如下:

 <RecentlyViewedEntityData etc="10007">
<RecentlyViewedItem>
<Type>0</Type>
<ObjectId>{5DA888D6-06A3-E611-816B-000D3A80C8B8}</ObjectId>
<EntityTypeCode>10007</EntityTypeCode>
<DisplayName>罗勇测试</DisplayName>
<Title>批量操作创建的罗勇测试记录</Title>
<Action></Action>
<IconPath></IconPath>
<PinStatus>false</PinStatus>
<ProcessInstanceId></ProcessInstanceId>
<ProcessId></ProcessId>
<LastAccessed>11/05/2016 03:20:58</LastAccessed>
</RecentlyViewedItem>
</RecentlyViewedEntityData>

怎么解决?当然你可以通过组织服务来清除这个字段的值,也可以直接用SQL来处理,比如将长度大于1000的清除:

 update UserEntityUISettings
set RecentlyViewedXml=null
where len(RecentlyViewedXml)>=1000

用SQL来清除这个MRU有个弊端就是需要重启IIS,因为它在服务器端有缓存。

当然也可以写程序来清除,目前没有看到界面上提供手动清除MRU的地方:

                 Console.WriteLine("本程序用于清理你输入账号的最近访问记录。");
string userName = string.Empty;
string passWord = string.Empty;
Console.WriteLine("请输入登录的用户名,输入完毕后按回车键确认:");
userName = Console.ReadLine().ToString().Trim();
Console.WriteLine("请输入登录的密码,输入完毕后按回车键确认:");
while (true)
{
ConsoleKeyInfo ck = Console.ReadKey(true);
if (ck.Key != ConsoleKey.Enter)
{
if (ck.Key != ConsoleKey.Backspace)
{
passWord += ck.KeyChar.ToString();
Console.Write("*");
}
else
{
Console.Write("\b \b");
}
}
else
{
break;
}
}
ClientCredentials cc = new ClientCredentials();
cc.UserName.UserName = userName;
cc.UserName.Password = passWord;
OrganizationServiceProxy orgSvc = new OrganizationServiceProxy(new Uri("https://demo.luoyong.me/XRMServices/2011/Organization.svc"),
null, cc, null);
WhoAmIRequest whoReq = new WhoAmIRequest();
WhoAmIResponse whoRep = orgSvc.Execute(whoReq) as WhoAmIResponse;
var userEntity = orgSvc.Retrieve("systemuser", whoRep.UserId, new ColumnSet("fullname"));
Console.WriteLine(string.Format("登录成功,欢迎{0},继续操作请输入y!", userEntity.GetAttributeValue<string>("fullname")));
var input = Console.ReadLine().ToString().ToUpper();
if (input == "Y")
{
QueryExpression qe = new QueryExpression("userentityuisettings");
qe.ColumnSet = new ColumnSet("recentlyviewedxml");
qe.Criteria.AddCondition("ownerid", ConditionOperator.Equal, whoRep.UserId);
var usersettings = orgSvc.RetrieveMultiple(qe);
if (usersettings.Entities.Count >= )
{
Console.WriteLine("共找到" + usersettings.Entities.Count + "条最近访问记录!");
foreach (var item in usersettings.Entities)
{
item["recentlyviewedxml"] = null;
orgSvc.Update(item);
}
}
}
else
{
Console.WriteLine("你选择了取消操作!");
}
Console.WriteLine("程序运行完成!");
Console.ReadKey();

据我对这个MRU的观察,MRU的缓存在IIS上有缓存,用户登录会从服务器上获取缓存,本地并不是通过浏览器来缓存,会在用户退出登录时候将访问记录写入到服务器端。所以仅仅依靠程序或者SQL来清除MRU还不管用,需要配合IIS重启。

系统在这个设计上可能欠缺考虑,比如针对某个实体的MRU如果超过一定的数量采用先进先出的方法自动清除掉前面的访问记录,毕竟保存那么多也没有很大的用处,除非你要做访问记录的审核。也可以考虑再某个地方让用户自行清理。希望微软Dynamics CRM产品组早日就此问题提出根本解决方案。

Dynamics 365中部分账号使用系统明显缓慢怎么办?先这么干!的更多相关文章

  1. Dynamics 365中的非交互式账号(Non-interactive User)介绍

    摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复272或者20180616可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...

  2. 自定义工作流活动报错:您无法登陆系统。原因可能是您的用户记录或您所属的业务部门在Microsoft Dynamics 365中已被禁用。

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复265或者20170926可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  3. Dynamics 365工作流报错:您无法登陆系统。原因可能是您的用户记录或您所属的业务部门在Microsoft Dynamics 365中已被禁用。

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复265或者20170926可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  4. 将Dynamics 365中的用户及其角色、角色导出到Excel中

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复240或者20161204可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  5. Dynamics 365中的应用程序介绍

    本人微信和易信公众号:微软动态CRM专家罗勇 ,回复275或者20180630可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  6. Dynamics 365中开发和注册插件介绍

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  7. Dynamics 365中配置和使用文件夹级别的跟踪(folder-level tracking)

    本人微信和易信公众号:微软动态CRM专家罗勇 ,回复274或者20180630可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  8. Dynamics 365中的事件框架与事件执行管道(Event execution pipeline)

    本文介绍了Microsoft Dynamics 365(以下简称D365)中的两个概念,事件框架(Event Framework)与事件执行管道(Event execution pipeline). ...

  9. Dynamics 365中的公告(Post)分析

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

随机推荐

  1. 入职15天,Angular2 小记!

    ng 配置@ngModule({ imports: [ BrowserModule ], //导入模块 declarations: [ AppComponent ], //导入组件 providers ...

  2. docker学习笔记--重基础使用

    最近一直在研究Elasticsearch,后来部门的同事遇到了一个docker集群的未授权访问漏洞,于是稍微看了一下docker进行了一下基本的入门,本文把自己学习docker的过程进行了一个详细的记 ...

  3. Java字符串格式化记录

    最近打log的时候用到了字符串的格式化. Java中String格式化和C语言的很类似.把情况都列出来,以后好查询. public static void main(String[] args) { ...

  4. Sqoop Java API 导入应用案例

    环境信息: Linux+JDK1.7 Sqoop 1.4.6-cdh5.5.2 hadoop-core 2.6.0-mr1-cdh5.5.2 hadoop-common 2.6.0-cdh5.5.2 ...

  5. IBATIS动态SQL(1)

    转:IBATIS动态SQL 直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值.参数本身和数据列都是动态SQL,通常是非常困难的.典型的解决办法就是用上一堆的IF-ELSE条件语句和一连串的 ...

  6. (转)JAVA新特征

    Java线程:新特征-有返回值的线程   在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.   现在Java终于有可返回值的任务 ...

  7. 介绍CSS的相关知识

    以下是我跟大家分享的有关CSS的相关知识点: ①什么是CSS? css(Cascading Style Sheets)是层叠样式表 ②css的三种样式使用方法: 1,内联样式表:直接在html标签属性 ...

  8. Jmeter之app性能测试(ios,android)

    测试小菜鸟alter今天一大早又学习了一点东西关于jmeter-app性能测试,现在记录一下.提到性能测试,那我就简单总结一下.(想跳过的,直接将页面下移到下一个红色字体处) 性能测试的相关知识介绍 ...

  9. 小程序server-实现会话层

    小程序server-实现会话层开发教程: 1.安装MongoDB #安装 MongoDB及其客户端命令行工具 yum install mongodb-server mongodb -y #查看版本 m ...

  10. rabbitmq重装之后无法加入原有cluster的bug解析

    背景: 一台controller node,一台compute1节点 两台机器的host文件均已经进行hostname解析 两节点本已经加入了同一rabbitmq cluster 但controlle ...