问题现象
顾问在操作物料-集团-保存时,发现相关操作非常卡顿,需要排查原因。
问题分析
查看NMC发现相关SQL耗时严重,是一条update语句

怀疑是缺少索引导致,故查看了相关sql的执行计划,发现索引非常好,统计信息也准,并且单次执行只需要0.1s。
怀疑数据库出现行锁,导致事务不提交,进而把相关update语句堵塞住了。

查询堵塞源头192,为server#http-bio-8080-exec-132#物料-集团-保存导致。

反关联NMC,查看相关的线程信息发现为自己本身。也就是说相关代码在调用sql更新表中字段信息后,未提交事务,导致数据库出现了行锁。
详细信息
----相关信息已经加密
<record>
<callid>1735786360893-5328</callid>
<服务>server</服务>
<线程名称>http-bio-8080-exec-132</线程名称>
<业务动作>物料-集团-保存</业务动作>
<线程状态>RUNNABLE</线程状态>
<当前事件>exec sql</当前事件>
<远程调用方法>nc.itf.bd.material.xxx.xxx.updateMaterialWithExtendVO</远程调用方法>
<耗时>383157</耗时>
<mwcosttime>21</mwcosttime>
<sqlnum>26</sqlnum>
<sqlcosttime>383129</sqlcosttime>
<readresulttime>6</readresulttime>
<readrownum>27</readrownum>
<readfromclienttime>1</readfromclienttime>
<writetoclienttime>0</writetoclienttime>
<writetoclientbytes>0</writetoclientbytes>
<readfromclientbytes>1845</readfromclientbytes>
<notclosedconnectioncount>1</notclosedconnectioncount>
<cc>2</cc>
<cmc>0</cmc>
<totalconn>2</totalconn>
<客户端地址>xxx.xxx.xxx.xxx:xxxxx</客户端地址>
<操作员>1001A1100000000BK2OW</操作员>
<调试模式>是</调试模式>
<操作员编码>xxx</操作员编码>
<操作员姓名>严苗</操作员姓名>
</record>
抓取堆栈信息发现
# 方法名随机加密为XXX
... ...
uap.mw.ds.xxx.executeUpdate(UAPStatementSkelecton.java:174)
uap.mw.ds.UAPStatement.xxx(UAPStatement.java:22)
nc.jdbc.framework.crossdb.xxx.executeUpdate(CrossDBStatement.java:297)
nc.jdbc.framework.JdbcSession.xxx(JdbcSession.java:396)
nc.bs.dao.BaseDAO.executeUpdate(BaseDAO.java:161)
nccloud.service.impl.CMTManagerImpl.updateSql_RequiresNew(CMTManagerImpl.java:18)
... ...
java.lang.reflect.Method.invoke(Method.java:606)
nc.bs.framework.ejb.CMTProxyImpl.delegate_RequiresNew(CMTProxyImpl.java:37)
nc.itf.framework.ejb.xxx.delegate_RequiresNew(CMTProxyEjbBean.java:38)
nc.itf.framework.ejb.xxx.delegate_RequiresNew(CMTProxy_Local.java:33)
... ...
nc.bs.framework.ejb.xxx.invoke(AbstractEJBServiceHandler.java:57)
nc.bs.framework.ejb.xxx.invoke(AbstractEJBServiceHandler.java:36)
com.sun.proxy.$Proxy30.delegate_RequiresNew(Unknown Source)
nc.bs.framework.ejb.CMTEJBServiceHandler.invoke(CMTEJBServiceHandler.java:30)
com.sun.proxy.$Proxy623.updateSql_RequiresNew(Unknown Source)
nccloud.service.impl.xxx.refreshUpdateMark(MaterialSyncImpl.java:229)
nccloud.service.impl.MaterialSyncImpl.xxx(MaterialSyncImpl.java:234)
... ...
nc.bs.framework.ejb.CMTProxyImpl.delegate(CMTProxyImpl.java:22)
nc.itf.framework.ejb.CMTProxyEjbBean.delegate(CMTProxyEjbBean.java:44)
nc.itf.framework.ejb.CMTProxy_Local.delegate(CMTProxy_Local.java:70)
sun.reflect.GeneratedMethodAccessor117.invoke(Unknown Source)
sun.reflect.xxx.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
nc.bs.framework.ejb.AbstractEJBServiceHandler.invoke(AbstractEJBServiceHandler.java:57)
nc.bs.framework.ejb.xxx.invoke(AbstractEJBServiceHandler.java:36)
... ...
解决方案
通过顾问沟通,发现此节点发生过客开,找到客开研发人员,通知其修改代码,调用update语句后,提交事务。后续问题解决。

1185

被折叠的 条评论
为什么被折叠?



