对多线程一直在用,但是从来没去深入研究过注意的事项,包括和锁的配合也是一知半解没有真正理解锁(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. PTA 6-12 (二叉树的递归删除)

    BinTree Insert( BinTree BST, ElementType X ) { if (BST==NULL) { BinTree tmp=(BinTree)malloc(sizeof(s ...

  2. MyEclipse 优化:之占用CPU过高100%

    原因是  jsp文件代码有4000行左右,MyEclipse打开jsp的时候会越来越慢.CPU占用会越来越高,因此,需要用别的编辑器打开jsp文件,不用在MyEclipse中编辑jsp文件. 我用的是 ...

  3. Codeforces 893A:Chess For Three(模拟)

    题目链接:http://codeforces.com/problemset/problem/893/A 题意 Alex,Bob,Carl三人下棋,每次只能两个人进行下棋,要求输的那个人当旁观者,然后给 ...

  4. Codeforces 1005D:Polycarp and Div 3

    题目链接:http://codeforces.com/problemset/problem/1005/D 题意 给出个字符串(全是数字),把这个字符串换分成一些子串,最多能划分多少个能够被3整除的子串 ...

  5. Apache 启动失败没有错误信息的解决办法

    在cmd命令行 进入到apache安装bin目录 执行以下 httpd.exe -w -n "apache2.2" -k start 注意apache2.2是你安装的apache服 ...

  6. java-代码块-局部代码块、构造代码块、静态代码块

    1.代码块概述: 在Java中,使用{ }括起来的代码被称为代码块. 2.代码块分类: 根据其位置和声明的不同,可以分为局部代码块,构造代码块.静态代码块和同步代码块(多线程). 3.常见代码块的应用 ...

  7. freemarker的template用法

    package cn.itcast.ssm.util; import com.alibaba.fastjson.JSONObject; import freemarker.cache.StringTe ...

  8. C# 日常

    var lines = JsonConvert.DeserializeObject<List<qqq>>(dataSource); 类参数   publist string d ...

  9. poj 2155 B - Matrix 二维树状数组

    #include<iostream> #include<string> #include<string.h> #include<cstdio> usin ...

  10. 《DSP using MATLAB》Problem 5.38

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...