mybatis线上问题查找

来源:互联网 发布:ddos网络攻击 编辑:程序博客网 时间:2024/06/03 05:07

线上反映查不到数据,根据业务逻辑把sql找出来执行,实际是有数据的。不知道什么原因,记录一下查找问题过程。

greys查找问题

greys对查找线上问题还是挺有帮助的,地址https://github.com/oldmanpushcart/greys-anatomy

进入greys

首先通过jps查到Java进程ID

sudo jps -l

切换到jetty账号,执行greys脚本进入

sudo su - jetty

sh greys.sh 16092

查看调用参数

ga?>watch -b com.dfire.soa.order.dao.ITotalPayDAO selectTotalPayCountInfo params[1]+’|’+params[2]
Press Ctrl+D to abort.
Affect(class-cnt:2 , method-cnt:4) cost in 228 ms.
Thu Oct 26 00:00:00 CST 2017|Sat Oct 28 00:00:00 CST 2017
Thu Oct 26 00:00:00 CST 2017|Sat Oct 28 00:00:00 CST 2017
Thu Oct 26 00:00:00 CST 2017|Sat Oct 28 00:00:00 CST 2017
Thu Oct 26 00:00:00 CST 2017|Sat Oct 28 00:00:00 CST 2017
Thu Oct 26 00:00:00 CST 2017|Sat Oct 28 00:00:00 CST 2017

确定没问题

查看返回参数

ga?>watch -s *Mapper selectTotalPayCountInfo returnObj -x 1
Press Ctrl+D to abort.
Affect(class-cnt:2 , method-cnt:2) cost in 341 ms.

null

发现返回参数是null,返回值有问题

问题定位

从SQL看没问题,但是查看类型是TotalPayPo,

<select id="selectTotalPayCountInfo" resultType="com.dfire.soa.order.domain.po.TotalPayPo">

返回实际类型需要TotalPayCount

TotalPayCount selectTotalPayCountInfo(@Param("entityId") String entity, @Param("currDate") Date currDate, @Param("twoDayAgo") Date twoDayAgo, @Param("isHide") Integer isHide);

这个地方mybatis居然没有报错,不可思议

查看mybatis源码才发现问题出现在DefaultResultSetHandler类的处理上,这个类负责对返回的数据进行组装转换,其中getRowValue方法中foundValues没有找到直接返回null了。感觉这里不合理,应该抛出异常,至少这里应该能够配置,不然这种配置错误不能及时被发现。

  private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap) throws SQLException {    final ResultLoaderMap lazyLoader = new ResultLoaderMap();    Object resultObject = createResultObject(rsw, resultMap, lazyLoader, null);    if (resultObject != null && !typeHandlerRegistry.hasTypeHandler(resultMap.getType())) {      final MetaObject metaObject = configuration.newMetaObject(resultObject);      boolean foundValues = resultMap.getConstructorResultMappings().size() > 0;      if (shouldApplyAutomaticMappings(resultMap, !AutoMappingBehavior.NONE.equals(configuration.getAutoMappingBehavior()))) {                foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, null) || foundValues;      }      foundValues = applyPropertyMappings(rsw, resultMap, metaObject, lazyLoader, null) || foundValues;      foundValues = lazyLoader.size() > 0 || foundValues;      resultObject = foundValues ? resultObject : null;      return resultObject;    }    return resultObject;  }

注:mybatis-3.2.7

原创粉丝点击