C# 多线程往数据库里插入数据!

cyshiwo01 2014-05-13 10:03:05
我是搞WEB开发的,但是现在要做一个winfrom程序,要使用多线程不停的往数据库里插入数据,想请教CSDN大神要使用几个线程比较好。代码要怎么写呢。跪求赐教!
...全文
2367 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
wh054 2016-08-01
  • 打赏
  • 举报
回复
一句话,开启事物处理,根本用不到多线程
小松鼠工作室 2016-07-29
  • 打赏
  • 举报
回复
沙发沙发
_小黑_ 2016-07-29
  • 打赏
  • 举报
回复
首先你要说清 数据量 大 的原因 是列多 还是其他的原因
redshiliu 2016-07-29
  • 打赏
  • 举报
回复
顶22楼,你首先要找到瓶颈,如果你只是往一个数据表里插入大量数据,你开N个线程和你开一个线程基本无区别,数据库资源是争用的。
风吹腚腚凉 2014-05-13
  • 打赏
  • 举报
回复
引用 16 楼 cyshiwo01 的回复:
[quote=引用 14 楼 wjfwd2010 的回复:] [quote=引用 7 楼 cyshiwo01 的回复:] [quote=引用 4 楼 u010909114 的回复:] 哈哈,最近也在做类似的工作;

 Thread myThread = new Thread(new ThreadStart(WriteDataToSql));
            myThread.Start();
或者你在一个线程池中也可以,只是效率可能会低点;
我也是这样写的。但是写多个线程调用同一方法的时候,会有数据并发,数据混乱的情况。请问大哥你是怎么解决这个问题的呢?[/quote] 数据库加约束或者锁。[/quote] 对对象进行加锁,那多线程的意义不久不存在的吗。。还是等于在排队运行。。 我的需求就是想多个线程同时添加,提高效率。 就好像让一个人干活,给他吃伟哥,也比不上2个人同时干活干得快吧[/quote] 你不是说要解决数据并发的问题么? 如果是同一个对象那就加锁第二次进来的时候就排队,如果不是的话,就不用排队了?难道你每次都是同一个对象? 所以你开的所有的线程都去同一个地方抓同样的数据,你确实没必要开多线程,否则就会出现数据混乱的情况啊 如果你的第一个线程去抓第一个数据,第二个线程抓第二个数据的话就有意义了啊. 又或者你先吧数据抓出来再用多线程进行插入,一个线程插入1,100行/一个101-200行
lele_nancy 2014-05-13
  • 打赏
  • 举报
回复
引用 5 楼 cyshiwo01 的回复:
[quote=引用 1 楼 xdashewan 的回复:] 插入数据库不推荐用多线程,可以开了数据库链接暂时不关,如果数据量巨大可以用批量插入的bulk copy方法,楼主能说下是出于什么情况会要多线程插入数据吗
因为要做个程序去批量从网上抓数据,然后加到数据库,我现在是单线程嘛。速度太慢,所以想如果用多线程速度就会快很多。[/quote] 对于找取数据部分用多线程,然后生成的SQL保存一下,开一个专门存储的线程。运行SQL语句。
xdashewan 2014-05-13
  • 打赏
  • 举报
回复
引用 16 楼 cyshiwo01 的回复:
就好像让一个人干活,给他吃伟哥,也比不上2个人同时干活干得快吧
这点我并不是很同意,如果真要使用多个线程去操作数据库,就必须要打开多个数据库链接或者使用链接池,因为对于单个数据库链接来说,简单sql语句是顺序执行的,你的进程只是同时把insert语句加入到sql的执行队列而已,不管你加的速度有多快,sql最终还是一条一条来执行,并没有并发效果
xdashewan 2014-05-13
  • 打赏
  • 举报
回复
楼主听听我的建议吧,首先你从网页上获取数据,可以是多线程也可以是唯一线程,数据归总到一个集合,后台起一跟线程,每隔一段时间去copy这个集合,并把集合清空等待下次填充。对copy的集合做去重处理,以免插入重复数据。多线程或者单线程检查是否与数据库有重复,可以预先抽取数据库数据到缓存,这样效率会比较高。把做完去重的数据整理出来,拼接成一句或多句可以一次执行的sql,执行sql(这里如果数据量巨大可以考虑用bulk copy),最后如果有缓存,更新下缓存,等待下次执行开始。
花开花折 2014-05-13
  • 打赏
  • 举报
回复
引用 7 楼 cyshiwo01 的回复:
[quote=引用 4 楼 u010909114 的回复:] 哈哈,最近也在做类似的工作;

 Thread myThread = new Thread(new ThreadStart(WriteDataToSql));
            myThread.Start();
或者你在一个线程池中也可以,只是效率可能会低点;
我也是这样写的。但是写多个线程调用同一方法的时候,会有数据并发,数据混乱的情况。请问大哥你是怎么解决这个问题的呢?[/quote] 哦,我的是另开一个线程,并且只有这个线程调用这个写数据的方法,至于你说的这种情况,还没遇到过,也没想过。涨知识了哦。 你为何不能将所有这些功能写在一个 方法里。
cyshiwo01 2014-05-13
  • 打赏
  • 举报
回复
引用 14 楼 wjfwd2010 的回复:
[quote=引用 7 楼 cyshiwo01 的回复:] [quote=引用 4 楼 u010909114 的回复:] 哈哈,最近也在做类似的工作;

 Thread myThread = new Thread(new ThreadStart(WriteDataToSql));
            myThread.Start();
或者你在一个线程池中也可以,只是效率可能会低点;
我也是这样写的。但是写多个线程调用同一方法的时候,会有数据并发,数据混乱的情况。请问大哥你是怎么解决这个问题的呢?[/quote] 数据库加约束或者锁。[/quote] 对对象进行加锁,那多线程的意义不久不存在的吗。。还是等于在排队运行。。 我的需求就是想多个线程同时添加,提高效率。 就好像让一个人干活,给他吃伟哥,也比不上2个人同时干活干得快吧
xdashewan 2014-05-13
  • 打赏
  • 举报
回复
引用 13 楼 cyshiwo01 的回复:
因为不只是插数据啊。还有包括抓数据,插数据,和其他一些逻辑处理的。。。我只是把这个问题简单的表达出来。我怕说得复杂了,把你们搞晕了。。。
我可以理解为什么要使用线程来插入数据,但问题是只要一跟数据插入就可以完成的,是否有必要使用多个进程来做,讨论的其实是这个,没别的意思,只是讨论下,也许我的观点是错的
风吹腚腚凉 2014-05-13
  • 打赏
  • 举报
回复
引用 7 楼 cyshiwo01 的回复:
[quote=引用 4 楼 u010909114 的回复:] 哈哈,最近也在做类似的工作;

 Thread myThread = new Thread(new ThreadStart(WriteDataToSql));
            myThread.Start();
或者你在一个线程池中也可以,只是效率可能会低点;
我也是这样写的。但是写多个线程调用同一方法的时候,会有数据并发,数据混乱的情况。请问大哥你是怎么解决这个问题的呢?[/quote] 数据库加约束或者锁。
cyshiwo01 2014-05-13
  • 打赏
  • 举报
回复
引用 9 楼 xdashewan 的回复:
[quote=引用 4 楼 u010909114 的回复:] 哈哈,最近也在做类似的工作;

 Thread myThread = new Thread(new ThreadStart(WriteDataToSql));
            myThread.Start();
或者你在一个线程池中也可以,只是效率可能会低点;
能请教下这样做法的意义吗,再可以打开数据库链接不关闭,循环插入数据,c#也支持一次执行多条insert语句,而且还有bulk copy的情况下为什么会选择线程方式去插入数据[/quote] 因为不只是插数据啊。还有包括抓数据,插数据,和其他一些逻辑处理的。。。我只是把这个问题简单的表达出来。我怕说得复杂了,把你们搞晕了。。。
风吹腚腚凉 2014-05-13
  • 打赏
  • 举报
回复
引用 2 楼 bdmh 的回复:
推荐的是根cpu数量一致或其2倍左右
CPU数×内核数
风吹腚腚凉 2014-05-13
  • 打赏
  • 举报
回复
引用 楼主 cyshiwo01 的回复:
我是搞WEB开发的,但是现在要做一个winfrom程序,要使用多线程不停的往数据库里插入数据,想请教CSDN大神要使用几个线程比较好。代码要怎么写呢。跪求赐教!
web本身就是个多线程,跟winfrom 区别不大吧?
cyshiwo01 2014-05-13
  • 打赏
  • 举报
回复
引用 6 楼 u010909114 的回复:
[quote=引用 4 楼 u010909114 的回复:] 哈哈,最近也在做类似的工作;

 Thread myThread = new Thread(new ThreadStart(WriteDataToSql));
            myThread.Start();
或者你在一个线程池中也可以,只是效率可能会低点;
我这个数据量比较小,只是比较频繁哦。[/quote] 你这只是写了一个。等于还是单线程咯。。只是UI界面不是同一个线程吧。
xdashewan 2014-05-13
  • 打赏
  • 举报
回复
引用 4 楼 u010909114 的回复:
哈哈,最近也在做类似的工作;

 Thread myThread = new Thread(new ThreadStart(WriteDataToSql));
            myThread.Start();
或者你在一个线程池中也可以,只是效率可能会低点;
能请教下这样做法的意义吗,再可以打开数据库链接不关闭,循环插入数据,c#也支持一次执行多条insert语句,而且还有bulk copy的情况下为什么会选择线程方式去插入数据
cyshiwo01 2014-05-13
  • 打赏
  • 举报
回复
引用 2 楼 bdmh 的回复:
推荐的是根cpu数量一致或其2倍左右
我尝试写了10个线程,并且对其控制不超过10个,然后数据完全混乱了。我使用对象的方式保存数据的。没加锁。但是加锁了。多线程不就等于白写了吗。请问版主我要怎么做呢?
cyshiwo01 2014-05-13
  • 打赏
  • 举报
回复
引用 4 楼 u010909114 的回复:
哈哈,最近也在做类似的工作;

 Thread myThread = new Thread(new ThreadStart(WriteDataToSql));
            myThread.Start();
或者你在一个线程池中也可以,只是效率可能会低点;
我也是这样写的。但是写多个线程调用同一方法的时候,会有数据并发,数据混乱的情况。请问大哥你是怎么解决这个问题的呢?
花开花折 2014-05-13
  • 打赏
  • 举报
回复
引用 4 楼 u010909114 的回复:
哈哈,最近也在做类似的工作;

 Thread myThread = new Thread(new ThreadStart(WriteDataToSql));
            myThread.Start();
或者你在一个线程池中也可以,只是效率可能会低点;
我这个数据量比较小,只是比较频繁哦。
加载更多回复(6)

111,082

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧