2 zlhzhj ZLHZHJ 于 2016.04.28 15:47 提问

asp.net 高并发下 一个web页面同时调用2个方法,这2个方法都是查询数据库,查询的结果乱掉了 20C

问题描述:这个问题只有在高并发情况下才会出现。
具体如下:
后台.cs有2个方法,这2个方法在前端.aspx通过流的方式调用(<%%>),然而DaoJiShi()这个方法获得的是gd()方法的数据,gd()获得的是DaoJiShi()方法的数据,那么在相应的方法里遍历DaTable的时候就会报列不存的情况。
这个问题让我很困惑,这样写已经很多项目了,都没这个问题。这个项目有时候会高并发,我测试也是疯狂刷新页面的时候才会出现,混迹CSDN5年了,突然怀疑自己不会写代码了
开始我怀疑是查询数据的公共方法QueryDataSetByParameters是静态(static)的原因,改成现在的动态的也会出现问题
我尽量少的去掉业务逻辑,关联的代码进行测试,代码贴出来,希望各位一起探讨下,如下:
aspx页面代码:

  <div class="wrap">
        <div class="box2">
            <ul>
                <%=gd()%>
            </ul>
            <ui>剩余时间:<%=intEndTime %></ui>
        </div>
    </div>

aspx.cs代码:

 public partial class mobile_FuDai3 : System.Web.UI.Page
{
    public int intEndTime = 0;
    protected void Page_Load(object sender, EventArgs e)
    {

        int intCount = DaoJiShi();

    }
    public int DaoJiShi()
    {
        string path = Server.MapPath("./log/error");
        int inth = DateTime.Now.Hour;
        int intResult = 0; DataTable Dt = null;
        try
        {
            string strSql = @"select isnull(COUNT(0),0) djs from kww_hongbao 
                        where type=17 and comment='抢福袋红包' and datepart(hh,createtime)= @H and userid=-1 and DATEDIFF(DAY,createtime,GETDATE())=0";
            SqlParameter[] Sp = { new SqlParameter("@H", inth) };
            DataSet ds = SqlDataOperator.QueryDataSetByParameters(strSql, Sp);
            if (ds != null && ds.Tables.Count > 0)
            {
                Dt = ds.Tables[0];
                if (Dt != null && Dt.Rows.Count > 0)
                {
                    intResult = Convert.ToInt32(Dt.Rows[0][0]);
                }
                Dt.Dispose();
            }
            ds = null;
        }
        catch (Exception ex)
        {
            Writer.WriteLog(path, "\n\r" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") +"错误信息1:" + ex.ToString() + "<br/>");
            foreach (DataColumn dc in Dt.Columns)
            {
                Response.Write(string.Format("1.列名:{0} ,数据类型:{1},值:{2}<br/>", dc.ColumnName, dc.DataType, dc.DefaultValue.ToString()));
                Writer.WriteLog(path, "\n\r" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + string.Format("1.列名:{0} ,数据类型:{1},值:{2}<br/>", dc.ColumnName, dc.DataType, dc.DefaultValue.ToString()));
            }
        }

        return intResult;
    }
    //头部滚动栏
    public string gd()
    {
        string strStatus = string.Empty;
        string strResult = string.Empty;
        string path = Server.MapPath("./log/error");
        StringBuilder sb = new StringBuilder();
        string strCache = "cache_fudai_gundong";
        string strSql = @"select top 100 t2.nickname,isnull(Convert(decimal(18,2),t1.num*0.0001),0) num from kww_hongbao t1
                            join kww_user t2
                            on t1.userid=t2.userid
                            where t1.type=17 order by t1.createtime desc";
        SqlParameter[] paramList = null;
        DataTable Dt = null;
        try
        {
            DataSet Ds = SqlDataOperator.QueryDataSetByParameters(strSql, paramList);
            if (Ds != null && Ds.Tables.Count > 0)
            {
                Dt = Ds.Tables[0];
                if (Dt != null && Dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in Dt.Rows)
                    {
                        string strNickname = dr["nickname"].ToString();
                        if (strNickname.Length > 2)
                        {
                            strNickname = strNickname.Substring(0, 2);
                        }
                        string strNum = dr["num"].ToString();
                        sb.AppendLine("<li>" + strNickname + "***抢到" + strNum + "元</li>");
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Writer.WriteLog(path, "\n\r" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "错误信息1:" + ex.ToString() + "<br/>");
            DataSet Ds1 = new SqlDataOperatorAuto().QueryDataSetByParameters(strSql, paramList);
            foreach (DataColumn dc in Dt.Columns)
            {
                Response.Write(string.Format("2.列名:{0} ,数据类型:{1},值:{2}<br/>", dc.ColumnName, dc.DataType, dc.DefaultValue.ToString()));
                Writer.WriteLog(path, "\n\r" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + string.Format("2.列名:{0} ,数据类型:{1},值:{2}<br/>", dc.ColumnName, dc.DataType, dc.DefaultValue.ToString()));
            }
        }
        Dt.Dispose();
        return sb.ToString();
    }
}

调用的公共查询数据库类方法:
/*参数化查询数据库 防止SQL注入*/

 public  DataSet QueryDataSetByParameters(string strSql, SqlParameter[] paramList)
        {
            SqlConnection SqlConn = new SqlConnection(sqlConfigStr);
            DataSet Ds = new DataSet();
            string strResult = string.Empty;
            try
            {

                SqlConn.Open();
                SqlDataAdapter Da = new SqlDataAdapter();
                Da.SelectCommand = new SqlCommand();
                Da.SelectCommand.Connection = SqlConn;
                Da.SelectCommand.CommandType = CommandType.Text;
                Da.SelectCommand.CommandText = strSql;
                if (paramList != null)
                {
                    Da.SelectCommand.Parameters.AddRange(paramList);
                }
                Da.Fill(Ds);
                Da.Dispose();
            }
            catch
            {

            }
            finally
            {
                SqlConn.Close();
                SqlConn.Dispose();
            }
            return Ds;
        }

1个回答

ZLHZHJ
ZLHZHJ   2016.04.28 17:41

怎么没人回答呢,应该是一个比较有意思的话题吧,难道是我没描述清楚么,高并发带来的异常,很吸引人吧

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!