zoukankan      html  css  js  c++  java
  • 对于edu近期bug的debug思路(等待放假归来验证)

    edu最近两周发生很奇怪的问题,如下图所示,这个bug的简单描述就是同样的语句,通过mysql.data,取数据库,取到的值不稳定,有的时候能返回正确的值,有的时候就返回null,一开始认为是我们内部orm框架的bug,但是后来用直接调用mysqlcommand的ExecuteScalar方法也依然报错。而且这个bug只要一重启之后就恢复正常,一段时间,可能1天可能2天就又会重现,完全不知道该如何下手。因为这个问题,edu产生了很多插曲,这个有空详细总结下edu在这次异动中的经验教训,项目两年了,还是不断重复着昨天的故事。

     

     

    回到这个bug,我今天回头从mysql.data的源码里面找原因,看到几个可疑的地方

    mysqlcommand的ExecuteScalar方法内部调用的还是mysqlreader这个对象,可以先排除语句本身的错误,因为确实没错,而且确实应该返回而且大部分时间返回正确的值,那么剩下的代码里面可以看到
    public override object ExecuteScalar()
      {
                lastInsertedId = -1;
                object val = null;

                MySqlDataReader reader = ExecuteReader();
                if (reader == null) return null;

                try
                {
                    if (reader.Read())
                        val = reader.GetValue(0);
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                        lastInsertedId = reader.InsertedId;
                    }
                    reader = null;
                }

                return val;
      }

    reader等于null,或者reader返回的结果为null会导致这个问题,那

    1、reader为null,构建reader失败可能就是原因

     在看reader返回结果是null又会存在什么可能?

    ExecuteReader()里面的代码

    catch (MySqlException ex)
                {
                    // if we caught an exception because of a cancel, then just return null
                    if (ex.Number == 1317)
                    {
                        if (TimedOut)
                            throw new MySqlException(Resources.Timeout);
                        return null;
                    }
                    if (ex.IsFatal)
                        Connection.Close();
                    if (ex.Number == 0)
                        throw new MySqlException(Resources.FatalErrorDuringExecute, ex);
                    throw;
                }

    这段catch里面有个值得注意的地方,

    2、错误代码1317,

    Error: 1317 SQLSTATE: 70100 (ER_QUERY_INTERRUPTED)

    Message: Query execution was interrupted

    官方的解释是代码执行被中断,这个也是个可能的地方

    总结,这次放假归来,我一定要查出这个bug的原因,而且我也发现大家对mysql.data不了解,这次debug输出出来的东西为什么要用cmd.ExecuteScalar这个方法,而不是直接用mysqlreader,这样才能看出问题的原因,工作在.net上,已经很多东西都看不到了,如果看过源码,一定知道要打印的是mysqlreader里面的东西,我们都还是低水平的debug。没见到高明的人是怎么做的。不要自我满足,你我都是井底之蛙。我们这没有牛人。

  • 相关阅读:
    开发入门
    Web开发的四个域
    JSP语法
    JSP入门
    变量的作用范围
    面向对象
    C#编译执行过程
    css3的渐变、背景、过渡、分页
    css3选择器总结
    css3基础选择器
  • 原文地址:https://www.cnblogs.com/brightwang/p/2004453.html
Copyright © 2011-2022 走看看