摘要: 本人微信和易信公众号: 微软动态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. 谈谈HashMap与HashTable

    谈谈HashMap与HashTable HashMap 我们一直知道HashMap是非线程安全的,HashTable是线程安全的,可这是为什么呢?先聊聊HashMap吧,想要了解它为什么是非线程安全的 ...

  2. ReactiveSwift源码解析(八) SignalProducer的代码的基本实现

    在前面几篇博客中我们详细的聊了ReactiveSwift中的Bag.Event.Observer以及Signal的使用方式和代码实现.那么在接下来的这几篇博客中,我们就依附于之前博客的基础上来聊一聊S ...

  3. .NET Core 事件总线,分布式事务解决方案:CAP

    背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用的过程中也会遇到分布式事务的问题,那么 CAP 就是在这样的背景 ...

  4. Extjs4+PHP MVC模式一(入门)

    Extjs是一个js框架,可以实现大部分web页面的东西,个人理解是一款集html.css.js一体的框架,功能挺强大的.结合PHP和sql可以实现整个系统.现在来说说怎么用它.(我的项目是用的TP框 ...

  5. PHP超全局变量$_SERVER

    $_SERVER 是一个包含了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组.这个数组中的项目由 Web 服务器创建.不能保证每个服务器都 ...

  6. [信息安全] 3.HTTPS工作流程

    [信息安全]系列博客:http://www.cnblogs.com/linianhui/category/985957.html 0. 简单回顾 在前面两篇博客中介绍了密码相关的一些基本工具,包括(对 ...

  7. [luogu P3384] 【模板】树链剖分 [树链剖分]

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  8. fzu 2257 saya的小熊饼干

    https://vjudge.net/problem/FZU-2257 题意:略 思路: 看题解补的题.正难则反的思想求概率. 首先,由于各维数之间是独立的.所以以x为例.首先,计算可以取到(i,j) ...

  9. 关于vue组件的一个小结

    用vue进行开发到目前为止也有将近一年的时间了,在项目技术选型的时候隔壁组选 react的时候我们坚持使用vue作为前端的开发框架.虽然两者思想上的差异不大,但是vue的语法在代码的可读性以及后期的维 ...

  10. 从.net到java,记录下这三个月的工作

    从事.NET开发已经4个年头,经过十余个项目的学习与沉淀,终于有了一套自己熟悉并且相对完善的技术体系,面对未知,不再惧怕.期间完成并广泛用于公司项目的作品包括: abp的二次开发框架BodeAbp 基 ...