日期:2014-05-17  浏览次数:20373 次

高并发下数据插入问题
本帖最后由 waCtr 于 2013-09-15 18:06:37 编辑
一个简单插入压力测试 
有50个表(tableAC1到tableAC50)和50个表(tableAB1到tableAB50)     我用的是webservice  客户端调用这个webservice  往里面插数据  客户端只需点击保存按钮一次   webservice中的这个插入方法  就将循环50次分别  往tableAC1到tableAC50 和 tableAB1到tableAB50 的表中插入这条数据

     我是这样写的 不知道 在高并发下  效率怎样(目前自己单独测试 感觉点击一次有点慢  高并发估计很慢 ,而且有可能会 这个循环还没执行完 下个就开始了。 望大神给个解决思路)
不知道说明白了没, 代码如下。

[WebMethod]
//tast  实体
public bool InsertList(tast sct)
{
List<DateHelper> List = null;//一个用来保存sql语句和值的类
bool Test=false;//用于记录插入是否成功
string tableAC1= "tableAC1";//表tableAC1
string tableAB1= "tableAB1";//表tableAB1
 for (int i = 1; i <=50; i++)
{
List = new List<DateHelper>();
string SQL1="insert into "+tableAC1+i+"(.....)values(....)";
 SqlParameter[] Par1 = new SqlParameter[]{
..
...
};
..
...
string SQL2="insert into "+tableAB1+i+"(.....)values(....)"
 SqlParameter[] Par1 = new SqlParameter[]{
..
...
};
..
...
 SqlDbHelper db = new SqlDbHelper();
 if (db.ExecuteSqlTran(List) > 0)//执行成功返回true否则else
{
 Test = true;
}
else{ 
Test = false;
 break;插入失败则直接跳出循环
}
}
}

补充下 比如执行一次插入 的话 循环到20此的时候  插入失败了  怎么办??
这么写 高并发的时候估计 会出问题???  

------解决方案--------------------
这种用循环,效果最差,如果没有什么特别的数据,直接传入参数,用存储过程处理,调用存储过程就可以了.

还有要用事务处理,要么全部成功,要么全部失败.
整个过程只要提交一次.
------解决方案--------------------
存储过程用循环和程序里用循环不一样.你要插入的数据是什么样子?你可以详细一点写出来,我试试看
------解决方案--------------------
在存储过程里执行要比在程序里执行快很多,你坚信这一点就是了
------解决方案--------------------
引用: