C#多线程更新,查询MongoDB数据
对多线程一直在用,但是从来没去深入研究过注意的事项,包括和锁的配合也是一知半解没有真正理解锁(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数据的更多相关文章
- MongoDB数据库中更新与删除数据
MongoDB数据库中更新与删除数据 在MongoDB数据库中,可以使用Collection对象的update方法更新集合中的数据文档.使用方法如下所示: collection.update(sele ...
- 多线程更新已排序的Datagridview数据,造成数据错位
多线程更新已排序的Datagridview数据,触发Datagridview的auto-sort时间,数据重新排序,造成后面更新数据的更新错误. 解决方法: 方法一.设置Datagridview的表头 ...
- 方法:查询MongoDB数据库中最新一条数据(JAVA)
使用JAVA语言查询MongoDB中某个数据库某个集合的最新一条数据: MongoCollection<Document> cpu = MongoClient.getDatabase(&q ...
- mysql根据查询结果批量更新多条数据(插入或更新)
mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...
- MongoDB数据查询 --MongoDB
1.插入测试数据 use flower db.goods.insert({'goods_name':'Hyacinth',price:10,num:800}) db.goods.insert({goo ...
- mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
mysql 控制台环境下查询中文数据乱码,插入.更新中文数据不成功 登录mysql密码是加入编码参数--default-character-set,中文用gbk mysql -uroo ...
- MongoDB数据查询详解
查询全部 db.infos.find(); db.infos.find({"url":"www.baidu.com"}); id不要显示出来 db.info ...
- DataGridView 多线程更新 数据 解决卡顿问题
使用多线程更新DataGridView,防止页面卡顿和卡死的问题 private delegate void UpdateDataGridView(DataTable dt); private voi ...
- mongoDB 数据导出与导入
一.导出 命令格式:在mongodb/bin目录下 mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv ...
随机推荐
- 如何更改Apache的根目录指向
更改Apache的默认网站根目录地址方法如下: 0,先找到主目录下的apache文件,然后进行下面操作 1.找到 DocumentRoot “X:/Apache/htdocs” 将“X:/Apache ...
- lesson9-小象学院cv
www.sohu.com/a/159976204_717210 生成模型:基于联合概率~共生关系判别模型:基于条件概率~因果关系 生成模型之学习数据分布:1)概率密度函数估计 2)数据样本生成 模型目 ...
- alpha冲刺(1/10)(作废)
前言 队名:旅法师 作业链接 队长博客 燃尽图 会议 站立式会议照片 会议内容 陈晓彬(组长) 昨日进展: 召开会议 安排任务 博客撰写 问题困扰: 没有做项目经理的经验,在沟通方面专业知识不够. 心 ...
- Create-React-App脚手架使用方法
Facebook 官方推出Create-React-App脚手架,基本可以零配置搭建基于webpack的React开发环境,内置了热更新等功能. 由于create-react-app命令预先安装和配置 ...
- Http&Tomcat
一张图 tomcat的安装和启用: Tomcat有安装版和解压版(绿色版)安装版以.exe形式的安装包,双击安装到我们的电脑上,用的比较少.解压版,即绿色版,解压后直接使用,用的比较多 bin:脚本目 ...
- centos7部署phpipam(ip管理系统)
安装必要的软件 yum install httpd mariadb-server php php-cli php-gd php-common php-ldap php-pdo php-pear php ...
- 开机或者安装系统时提示tsc: Fast TSC calibration failed解决方法
其实这个问题很简单,主要是时间不对的问题. 就拿我遇到这个问题来说.我是在vm虚拟机中安装了xenserver,然后在物理机安装xencenter连接xenserver,然后在安装新的虚拟机时遇到这个 ...
- MySQL Transaction--TPS计算规则
TPS计算规则 在MYSQL 中,TPS(Transaction Per Second)的计算方法为 (com_commit+com_rollback)/time,但com_commit和com_ro ...
- day 60 Bootstrip学习
图标地址 http://fontawesome.io/icons/ 图标用法地址 http://fontawesome.io/examples/ 实现代码 <!DOCTYPE html> ...
- supervisor使用总结
简介: Supervisor是一个进程控制系统. 它是一个C/S系统(注意: 其提供WEB接口给用户查询和控制). 它允许用户去监控和控制在类UNIX系统的进程. 它的目标与launchd.daemo ...