对多线程一直在用,但是从来没去深入研究过注意的事项,包括和锁的配合也是一知半解没有真正理解锁(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. s21day03 python笔记

    s21day03 python笔记 一.昨日内容回顾及补充 回顾 补充 运算符补充 in 在里面 not in 不在里面 优先级补充(>优先于not) 二.整型(int) 数字表示 python ...

  2. nmon使用命令

    nmon使用命令   启动nmon后, c       查看CPU监控的窗口 mV     查看内存和虚拟内存            V是大写 ndt     查看网络.磁盘和虚拟进程 q      ...

  3. java-SimpleDateFormat类

    1.SimpleDateFormat类实现日期和字符串的相互转换 * A:DateFormat类的概述 * DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或 ...

  4. Atom编辑神器

    最近喜欢上了Atom编辑神器,安装就不说了,重点讲配置. 一:软件配置 1.先将欢迎界面去掉,每次打开Atom的时候都会出现,实在是很烦人. 就在欢迎界面里面有个复选框,去掉选中就可以了. 2.让At ...

  5. Windows下安装pymssql

    准备用Python接入Sql Server数据库,因此准备用pymssql模块. 安装有点纠结. 64位win10系统,python3.6 步骤: 首先需要配置一下freetds: 在这里下载:htt ...

  6. php 页面调转导致session丢失解决方法

    例如在a页面设置了会话,然后打印会话值,可以成功打印,但是调转到b页面后,会话丢失了. 原因有不少,一个原因就是没有在页面开头加入session_start();当然你也可以直接配置php.ini文件 ...

  7. Centos7使用PXE+Kickstart无人值守安装服务

    首先,关闭selinux和防火墙(二次修改版本) 我们需要安装的软件如下 dhcp(用来获取ip) tftp-server httpd syslinux(不安装这个后面会没有pxelinux.0这个文 ...

  8. centos7 虚拟机安装 以后不能联网问题

    1 设置 网络模式为桥接. 2 配置/etx/sysconfig/network-scrips/ifcfg-enthp0s3为如下配置( ip 网段 根据自己网段决定) TYPE=Ethernet P ...

  9. 关于STM32 ADC自校准的个人理解

    前几天发过一篇帖子,叫:关于STM32 ADC自校准的个人理解文章大体说的是自校准前要先将ADON位置1,之后再校准. 本以为彻底的了解了自校准的过程,但是昨天晚上无意间看到了一个函数说明,不禁愁云又 ...

  10. Xshell中vim退出内容仍停留在屏幕的问题

    Xshell中vim退出内容仍停留在屏幕的问题 我每次在vim中退出后内容都显示在屏幕上面,看上去特别烦,就在网上看了下,通过调试成功. 第一种方法:在xshell中设置 1.这是我在vim中退出的状 ...