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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
一个方法最多2个线程同时使用的JAVA实现
原文:http://www.java2000.net/p11416题目来自论坛,有兴趣的可以去看看 http://topic.csdn.net/u/20081030/22/31029956-fa0d-46a5-8b14-e9c971f29054.html重点是,1 保证只有2个实例可用,且每个实例的方法做成同步。import java.util.concurrent.BlockingDeque;i
C#--如何在一个函数中返回两个值(包含数组的参数)
/*烟台大学计算机学院学生 *All right reserved. *文件名称:C#--如何在一个函数中返回两个值(包含数组的参数) *作者:杨飞 *完成日期:2014年9月2日 *版本号:v1.0 *对任务及求解方法的描述部分:C#--如何在一个函数中返回两个值(包含数组的参数) *我的程序:*/ using System; using Sys
php连接两个表然后查询数据代码,
First program $t=@$_POST["student.学生学号"]; $coon=mysql_connect("localhost","root","su"); mysql_query('SET NAMES gbk');  mysql_select_db('school'); if (!empty($t)) {     $result=mysq
mybatis 调用存储过程,处理返回2个不同类型的结果集
Expected one result (or null) to be returned by selectOne()
高并发编程之面试题一
题目:实现一个容器,提供两个方法,add,size。写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束。 程序一,分析下面程序能否实现 List lists = new ArrayList(); public void add(Object o) { lists.add(o); } publi...
当需要2个事务才能完成一个完整业务时,回滚解决办法!抛砖引玉
这种情况一般会发生在与其他程序远程交互等待时间比较长的情况,例如:在作一个银行子系统比如基金认购,需要和储蓄系统进行交互! .基金认购时候需要对产品的剩余进行减少 和储蓄系统交互需要5秒,对此人账户进行扣款这时候就需要2个事务!为什么?想象一下全国的系统如果一个交易锁5秒数据库那么。。。。。。。。(效率及其低下,如果先不减去等储蓄的信息回来後在回滚,这样可能造成最后
C#学习笔记——参数传递
1、值传递 (1)参数为值类型 方法内发生的任何更改对变量的原始值无任何影响。 (2)参数为引用类型 EX staticvoid Change(int[] pArray) ; Change(arr); 由于参数pArray是对arr的引用,所以有可能更改数组元素的值。但是,试图将参数pArray重新分配到不同的内存位置时,该操作仅在调用方法内有效,并不影响原始变量arr。 2、引用
三种方法实现从“一个(组)查询过程中返回两个表的查询结果”
还记得
_009_jQuery 选择同时包含两个class的元素的实现方法
jQuery 选择同时包含两个class的元素的实现方法Jquery选择器 多个 class属性参照以下案例 &amp;lt;element class=&quot;a b good list card&quot;&amp;gt;1. 交集选择: $(&quot;.a.b&quot;) --选择同时包含a和b的元素。2. 并集选择:$(&quot;.a, .b&quot;) --选择包含a或者包含b的元素。3.依次过滤  $(“.good”).filter(“.list”...
多个对象同时使用一个对象的同步问题
写了段代码,主要部分如下: public void OnMouseOver() { hovering = true; //使用 } public void OnMouseExit() { hovering = false; } void Update() { if (hoveri