【BOS基础系统_权限】用户登录GUI客户端之后初始化菜单很慢原创
金蝶云社区-汪伟康
汪伟康
6人赞赏了该文章 229次浏览 未经作者许可,禁止转载编辑于2021年05月12日 20:33:03
问题现象:用户分配分配很多权限之后登录后进入初始化界面就很快,没有分配权限就很慢,要等3分钟以上


分析过程:

1、重现问题,服务工具平台-日志收集-取【错误日志】,包含客户端client.log,log4j.log,当前实例的apusic.log

2、分析log4j.log

1.png

2.png

3.png


3、查看rpc线程堆栈和ksql线程

服务器http/rpc线程堆栈: http://{easserverip}:{port}/easportal/tools/threaddump.jsp?thread=RPC&live=true
服务器ksql线程堆栈: http://{easserverip}:{port}/easportal/tools/ksqltrace.jsp
living rpc threads

4.png

ksql对应线程堆栈

5.png

6.png


4、根据步骤3中运行中的线程堆栈找到代码中对应的方法行(MainMenuQuickHelper.getChildMenuByParent),结合方法中日志在所有实例apusic日志中搜索分析

7.png

8.png

5、根据apusic.log确认问题为该条sql执行耗时长(还有其他sql也有较长,此条相对更长,以做分析):

SELECT FID, FName_l2, FLongNumber, FIsLeaf, FShortCutCode, FOpenMethod, FUiClassName, FImagePath, FFunction,FEnabled,FNumber,FUiClassParam,FUiOprt  FROM T_PM_MAINMENUITEM MAIN1  WHERE MAIN1.FPARENT IS NULL  AND MAIN1.FIsLeaf = 0  AND EXISTS   (SELECT 1       FROM T_PM_MAINMENUITEM MAIN2     WHERE MAIN2.FUICLASSNAME IS NOT NULL            AND MAIN2.FUICLASSNAME <> ' '           AND MAIN2.FEnabled = 1           AND MAIN2.FVisible = 1           AND MAIN2.FIsLeaf = 1         AND (MAIN2.FMenuType = 10 OR MAIN2.FMENUTYPE IS NULL)         AND MAIN2.FLONGNUMBER||'!' LIKE            CONCAT (MAIN1.FLONGNUMBER, '!%')            AND ( EXISTS(SELECT 1 FROM ( SELECT FID AS FPermItemID FROM T_PM_PermItem permitem where permitem.FISLEAF = 1 and (  exists ( SELECT 1 from t_pm_userorgperm UserOrgPerm where UserOrgPerm.FOWNER ='JN8/TYLvQzWQmXwJ+NKFTRO33n8='  and UserOrgPerm.FPERMITEMID = permitem.fid AND UserOrgPerm.FPermType = 10) or exists( SELECT 1 FROM t_pm_role role inner join t_pm_roleperm RolePerm on role.FID =RolePerm.FRoleID where RolePerm.FPERMITEMID =permitem.fid and RolePerm.FPermType = 10 and exists (select 1 from T_PM_UserRoleOrg USERROLEORG where USERROLEORG.FUSERID = 'JN8/TYLvQzWQmXwJ+NKFTRO33n8=' and USERROLEORG.FROLEID = role.FID)))) A WHERE MAIN2.FFUNCTION = A.FPermItemID ) OR MAIN2.FFUNCTION IS NULL OR MAIN2.FFUNCTION = ' ' OR MAIN2.FFUNCTION = '')  AND (MAIN2.FUiClassName NOT IN ('com.kingdee.eas.rpts.sumreport.client.SumTaskListUI','com.kingdee.eas.rpts.sumreport.client.UploadTaskListUI','com.kingdee.eas.rpts.ctrlreport.client.ExtReportRunUI','com.kingdee.eas.rpts.ctrlreport.client.ReportRunTimeUI') OR MAIN2.FID IN ('NO_SUIT')) AND (MAIN2.FUiClassName NOT IN ('/easweb/bos/qing/publish/analysis.do','com.kingdee.eas.rpts.qinganalysis.ui.PublishedQingAnalysisExplorer') OR MAIN2.FID IN ('NO_SUIT')) ) order by MAIN1.FORDER, MAIN1.flongnumber


6、分析sql,分配权限多查的快,没有分配权限查询慢问题

9.png

7、解决建议
通常oracle数据库会定期对每个表的执行计划进行分析更新,如果以上sql第一个条件查询耗时长,则应该去下面一个OR条件判断,第二个条件也是可以很快查询到结果的。

目前看怀疑该表t_pm_userorgperm表的执行计划没有被分析更新,需要检查


1:该表执行计划最后被分析的时间
select t.TABLE_NAME,t.NUM_ROWS,t.BLOCKS,t.LAST_ANALYZED from user_tables t where table_name LIKE 'T_PM_%' order by  t.LAST_ANALYZED  asc
发现该数据库权限项相关表只有T_PM_PERMITEM之前被分析过,其他都没有LAST_ANALYZED,说明没有被分析过
2:该表执行计划是否被锁
select table_name from user_tab_statistics where stattype_locked is not null;
也没有查到被锁的表
3、手动在eas服务器控制台,选择对应的数据中心-统计分析-登录-选择想要进行分析的表(这里选择我们T_PM相关的表),进行分析,分析完成之后再进行登录测试
4、经测试现在没有分配权限的用户登录进入主菜单界面耗时很短,问题确认解决。


赞 6