对多线程一直在用,但是从来没去深入研究过注意的事项,包括和锁的配合也是一知半解没有真正理解锁(lock)的用法。

这次在做数据分析是需要将访问的url中host部分记录,如果已经存在就直接匹配id,没有就新增。为了提升效率马上想到的就是多线程,因为程序自身比较复杂,就大篇幅贴代码了。

主要思路:lock是对实例进行上锁的,如果线程中每个线程都创建了不同的实例那lock的意义也就随之不存在。

如果涉及到多层类的引用和传递,那就在进程入口处做一次实例化,需要类的初始化或者调用时,一层层去传递直到业务逻辑处理处上锁操作。

如果对于上边两句话理解起来比较抽象的话,那接下来就这么理解。

例子:现在需要做一个程序,且使用10个线程,每个线程只需要做一次累加操作,当最终值等于1000时终止程序。

实现上面例子时,你当然会毫无疑问想到在线程外定义一个全局变量,然后线程中对全局变量lock,一样的道理,在自己的程序中也需要lock这些字段才有意义。

总之通过上边说的例子去揣摩就可以。

项目示例代码(抽出关键代码):

public class CountService
{
private static MongoService mdbs;//定义全局字段 public CountService()
{
mdbs = new MongoService();//构造函数初始化
}
public void Start()
{
new VisitsCount(li, _visits.RedisClient, mdbs);//调用另一个业务类需要把示例传递过去
} } public class VisitsCount
{
private readonly MongoService dbs; public VisitsCount(MongoService mdbs=null)
{
dbs =mdbs??new BLL.MongoService();
} public void Get()
{
lock (dbs)
{
//写下对mongodb的查询,更新,添加
}
}
}

多线程调用

Thread[] VisitsAnalyThreads = new Thread[];
for (int i = ; i < VisitsAnalyThreads.Length; i++)
{
VisitsAnalyThreads[i] = new Thread(MyService.Start) { Name = "访问分析" + (i + ) + "#" };
}
foreach (var VAitem in VisitsAnalyThreads)
{
VAitem.Start();
}

这样mongdb的示例被层层传递最终实现多线程的正常操作。

另外mongdb自身也是支持锁的,但是C#的MongoDB.Driver并没有对其做事物支持 。

可以通过database.RequestStart();database.RequestDone();但是这个操作知识解决mongdb的并发问题,解决不了多线程上述引起的问题的。

C#多线程更新,查询MongoDB数据的更多相关文章

  1. MongoDB数据库中更新与删除数据

    MongoDB数据库中更新与删除数据 在MongoDB数据库中,可以使用Collection对象的update方法更新集合中的数据文档.使用方法如下所示: collection.update(sele ...

  2. 多线程更新已排序的Datagridview数据,造成数据错位

    多线程更新已排序的Datagridview数据,触发Datagridview的auto-sort时间,数据重新排序,造成后面更新数据的更新错误. 解决方法: 方法一.设置Datagridview的表头 ...

  3. 方法:查询MongoDB数据库中最新一条数据(JAVA)

    使用JAVA语言查询MongoDB中某个数据库某个集合的最新一条数据: MongoCollection<Document> cpu = MongoClient.getDatabase(&q ...

  4. mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  5. MongoDB数据查询 --MongoDB

    1.插入测试数据 use flower db.goods.insert({'goods_name':'Hyacinth',price:10,num:800}) db.goods.insert({goo ...

  6. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功

    mysql 控制台环境下查询中文数据乱码,插入.更新中文数据不成功         登录mysql密码是加入编码参数--default-character-set,中文用gbk mysql -uroo ...

  7. MongoDB数据查询详解

    查询全部 ​ db.infos.find(); db.infos.find({"url":"www.baidu.com"}); id不要显示出来 db.info ...

  8. DataGridView 多线程更新 数据 解决卡顿问题

    使用多线程更新DataGridView,防止页面卡顿和卡死的问题 private delegate void UpdateDataGridView(DataTable dt); private voi ...

  9. mongoDB 数据导出与导入

    一.导出 命令格式:在mongodb/bin目录下 mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv ...

随机推荐

  1. 论文阅读理解 - Stacked Hourglass Networks for Human Pose Estimation

    http://blog.csdn.net/zziahgf/article/details/72732220 keywords 人体姿态估计 Human Pose Estimation 给定单张RGB图 ...

  2. linux 系统 目录,以部分及相关命令

    linux 系统里的文件类型有: b. d.l. c. -  .s (块设备.目录.软连接.数字串设备.普通文件(文本.二进行文件).socket文件 ) ls 命令 ls -a  查看当前目录下的所 ...

  3. 大型网站系统与Java中间件实践读书笔记

    转载:http://blog.csdn.net/ioscodelover/article/details/45047869 1.分布式系统相对集中式而言,是指多台计算机互相通过消息通信进行协作而对外提 ...

  4. zeebe 为微服务架构的工作流引擎

    zeebe 是灵活.轻量的基于微服务架构的工作流引擎 包含以下特性: 可视化的额工作流 审计日志以及历史 水平缩放 持久化&&容错 消息驱动 操作容易 语言无关 工作流基于标准bpmn ...

  5. jquery trigger函数和triggerHandler函数的对照

    一句话的差别就是:trigger will bubbling jQuery events (not default DOM events) and triggerHnadler will not do ...

  6. 如何优化JavaScript的构造函数

    首先看一个构造函数User,我们在调用User创建一个实例的的时候,一般都是要写上new操作符的.在这里说明一下,如果使用new关键字调用构造函数,那么构造函数里面的this总是是指向一个全新的对象( ...

  7. Easy to use cross-platform 3D engines

    C++ http://gamedev.stackexchange.com/questions/21/easy-to-use-cross-platform-3d-engines-for-c-game-d ...

  8. dnstop DNS分析工具

    http://dns.measurement-factory.com/tools/dnstop/src/ https://github.com/measurement-factory/dnstop h ...

  9. bzoj 2870 最长道路tree——边分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2870 关于边分治:https://www.cnblogs.com/Khada-Jhin/p/ ...

  10. iOS开发 SourceTree将develop合并到master分支的详细步骤