后台插入多条数据到数据库
|
用户在活动添加页面添加一个活动,活动名字叫“拆礼盒”,一个活动可以有多个礼盒,每个礼盒又可以设置奖品数量,保存后我们又要自动生成一个兑奖码,有多少奖品就有多少兑奖码;
问题来了,当用户设置奖品数量很大时,比如1000,后台就要循环1000次生成兑奖码然后插入数据库,这个过程是很慢的,本人测试,1条条的插,800条需要15秒左右,使用SQLBulkCopy减少大约一半的时间,但是2000条使用SQLBulkCopy也需要1分钟左右时间,用户能等我也不能忍啊! 果断选择多线程,看起来效果不错,页面立刻提示完成,插入兑奖码的过程在后台默默的执行着,但是一查看数据库发现,插入的兑奖码有重复(理论上是不允许重复的),并且数量与用户填写的不一致,不是多了就是少了,多线程嘛,这是正常现象,但是不知道应该在哪里加锁,怎么加锁,有没有大神指点一下啊! 这是第一个方法,循环礼盒数量准备参数 ![]() 这是第二个方法,也就是后台线程调用的方法,循环奖品数量,生成兑奖码(SN码)使用SQLBulkCopy插入数据库,哪里需要加锁?
|
|
|
|
#1 得分:5回复于: 2014-12-04 21:17:36
加神马锁啊?!
比如说,开启10个线程,2000条数据,每个线程处理200条,要锁干神马?! |
|
#2 得分:0回复于: 2014-12-04 21:17:48
加神马锁啊?!
比如说,开启10个线程,2000条数据,每个线程处理200条,要锁干神马?! |
|
#3 得分:30回复于: 2014-12-04 23:11:31
跟加锁没有关系,你的子线程中不能使用做为foreach循环变量的model变量。你需要在foreach方法内部另外声明一个变量,把model赋值给它,然后在你你的 threadstart 中使用这个局部声明的变量(而不是model)。
另外,这丝毫不会让插入动作变快,相反可能稍慢。只是界面上反映“快”了而已。 |
|
|
#4 得分:5回复于: 2014-12-05 08:17:44
你可以把多条insert拼接成一个sql语句一次性插入
也可以定义个存储过程,把生成的字符串数组传进去,让数据库自己循环插入 也可以先循环生成随机数,放到一个数组里,再用多线程去数组里取值然后插入 不过多线程也不过是让界面看起来不卡而已,后台数据还是都在排队,并不是一股脑的都扔给服务器了 |
|
|
#5 得分:0回复于: 2014-12-05 09:57:57
3楼的解法我试了,有效果,数量对了,但是生成的SN码还是有重复的,是不是第二个方法哪个地方也需要改一下?用多线程其实就是为了页面上看上去“快”而已,只要用户等待时间不长就可以,后台执行个1,2分钟也没事,这只是延迟一下没关系。
|
|
|
#6 得分:0回复于: 2014-12-05 10:13:38
生成SN又不耗多少时间,你先循环生成不重复的SN,然后开多线程入库不行吗
在不同线程里去执行生成SN,难免会重复 而且把你SN生成的方法放出来,是否本身算法就有问题 |
|
|
#7 得分:0回复于: 2014-12-05 10:24:54
我知道了,原来的是生成一个SN立刻插入数据库,然后每次再生成就去判断一下是否已经存在数据库中,而现在是先生成,最后统一插入数据库,所以判断的时候就不是去数据库判断了,而是判断刚生成的SN中是否已存在,这样才不会重复。
还有你说的,方法我也试过,组成一个“1111,2222,333”这样的格式的SN去数据库循环插入,也很费时,统一组成DataTable使用SQLBulkCopy拷贝也很费时,使用多线程就是让页面不再等待,这个生成SN的方法在后台默默执行就可以,执行3分钟都没关系 |


浙公网安备 33010602011771号