问题描述
- asp.net 高并发下 一个web页面同时调用2个方法,这2个方法都是查询数据库,查询的结果乱掉了
-
问题描述:这个问题只有在高并发情况下才会出现。
具体如下:
后台.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, "nr" + 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, "nr" + 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, "nr" + 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, "nr" + 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; }
解决方案
怎么没人回答呢,应该是一个比较有意思的话题吧,难道是我没描述清楚么,高并发带来的异常,很吸引人吧
时间: 2024-09-20 04:01:04