mybatis线上问题查找

线上反映查不到数据,根据业务逻辑把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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值