首页 新闻 会员 周边 捐助

C#多线程插数据问题

0
悬赏园豆:20 [已解决问题] 解决于 2016-06-06 17:51

小弟在项目中运用到了c#多线程调用类似于DBHepler这种帮助类插入数据,不过是mongodb的帮助类,(他这个帮助类都是每次连接完成之后就会释放,比如:我进行一次查询,他会开启数据库连接,然后查询完毕就释放。)在运用多线程同时调用的时候估计是在某一个线程查询的时候,另一个线程正好把他释放掉了,然后就会抛出异常。各位大神有什么办法解决吗?

是不是必须每个线程里面自己写一个去开启mongodb连接???

猫出没的主页 猫出没 | 菜鸟二级 | 园豆:219
提问于:2016-06-06 15:46
< >
分享
最佳答案
0

mongodb的这个helper里面的connection不要做成单例就完事了。没多少并发的,就这样用用就可以啦

如果瞬时并发很高,那就做个connectrion的pool。

收获园豆:15
czd890 | 专家六级 |园豆:14488 | 2016-06-06 15:57

这个helper是个静态类,不存在单例,,

pool?是指

虽然没有什么并发,但是确实存在同一瞬间一个线程正在查询,另一个线程吧这个对象给释放了,就抛了。。。

类似于这种:查询的时候就开启一次,查询完毕就释放。

猫出没 | 园豆:219 (菜鸟二级) | 2016-06-06 16:05

@猫出没: GetServer()里面return的server不要单例

czd890 | 园豆:14488 (专家六级) | 2016-06-06 16:18

@calvinK: 

这个是getserver里面的代码,,不是单例。。。

猫出没 | 园豆:219 (菜鸟二级) | 2016-06-06 16:59

@猫出没: 刚才看了一下mongo的用法,mongoclient不需要disconnect

 

http://www.cnblogs.com/kingdomheart/archive/2012/12/29/2839124.html

czd890 | 园豆:14488 (专家六级) | 2016-06-06 17:18

@calvinK: 

看下这篇博客,有帮助,特别是中间一段,可能,你的这个helper写的有些问题,需要修改修改

czd890 | 园豆:14488 (专家六级) | 2016-06-06 17:21

@calvinK: 

大神,这是指这个意思么?

猫出没 | 园豆:219 (菜鸟二级) | 2016-06-06 17:38

@calvinK: 这个我刚刚在一网站看到的,

猫出没 | 园豆:219 (菜鸟二级) | 2016-06-06 17:41

@猫出没:

1.多线程安全,就是说是并发安全的,多个线程并发使用不会出问题。

2.是的,看文档说明是他本身内部做了pool处理,不需要自己再去管理了。用完就丢就ok

czd890 | 园豆:14488 (专家六级) | 2016-06-06 17:44

@calvinK: 太感谢您了,花费时间回答我的问题!

猫出没 | 园豆:219 (菜鸟二级) | 2016-06-06 17:51

@猫出没: 客气,顺带自己还看了一下mongo的用法(^^)

czd890 | 园豆:14488 (专家六级) | 2016-06-06 17:51
其他回答(1)
0

可以每个线程开启一个连接,也可以做线程同步。

线程同步

收获园豆:5
写代码的小2B | 园豆:4377 (老鸟四级) | 2016-06-06 15:54

不能做线程同步,小弟做的是一个获取服务器各种指标的东西,其每隔10秒获取一次,是并行的。。

难道真要每隔线程都要开启一个连接了么,,大神还有没有什么办法

支持(0) 反对(1) 猫出没 | 园豆:219 (菜鸟二级) | 2016-06-06 15:58

@猫出没: 

不一定要每个线程开启一个链接,也可以按楼下说的做一个连接池,如果并发高还需要排队。

所以不要纠结了,按楼下说的连接对象不要做成单例。 每次使用创建新的连接就好。

支持(0) 反对(0) 写代码的小2B | 园豆:4377 (老鸟四级) | 2016-06-06 16:05

@写代码的小2B: 看来没办法了,,队列就不需要了吧。。。。直接创建新连接吧。。谢谢

支持(0) 反对(0) 猫出没 | 园豆:219 (菜鸟二级) | 2016-06-06 16:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册