SQL/MongoDB 连接并发测试

       最近一直在搞mongodb 文件服务器大量文件并发上传测试,在官方文档发现mongo是线程安全的,支持单一连接下的并发操作。印象ADO.NET 似乎不支持单一连接并发。于是,测试一下来证实这个疑虑。(前两篇小记一直纠结mongodb吃内存导致并发文件上传变慢问题,经过这两天测试,发现文件并发上传越来越慢的瓶颈是磁盘的IO读写的瓶颈)

以10W条/20W条 记录写入测试,下面是测试结果

操作10W w/s20W w/s操作方式备注
179.958163.396主线程 有池 单连接 单打开单打开指的一次open close 内执行所有写入操作
279.958164.412主线程 有池 单连接 多打开多打开指的写入一次就open close一次
    总结:可以看出有池的情况open close基本没有性能消耗。
MSDN官方解释,池的效果在minpoolsize不为零的情况,
总保持相应数量的活动连接,当Open的时候实现直接用了活动连接,
而Close操作并没close,只是又将活动连接放回池里。
379.13163.396主线程 无池 单连接 单打开 
4290.334620.694主线程 无池 单连接 多打开 
    总结:无池的情况下,open close非常消耗性能,由于没池每次Open
Close 都要打开关闭连接 ,所以效率没有池高。
549.13142.33单线程 无池 单连接 单打开异步执行反而快了?测了几次都这个结果
6326.495865.44单线程 无池 单连接 多打开 
     
7137.985 有池 单连接 单打开 10线程并行写入  写入锁Ado.net 不支持单连接并行写入 通过线程锁控制实现
8141.464 有池 单连接 多打开 10线程并行写入  写入锁Ado.net 不支持单连接并行写入 通过线程锁控制实现
    总结:单连接通过写入锁控制多线程写入速度明显慢了很多,
单连接并不适合并发写入操作。
918.94337.815有池 10连接并行 单打开 相当于操作1 ----  10个单连接 单打开 的并行操作
1019.65841.793有池 10连接并行 多打开 相当于操作1 ----  10个单连接 多打开 的并行操作
    总结: 多线程并行多连接的操作效果还是很理想的,发挥了多线程任务的优势。Connection是非线安全的,也就是说最好为每个线程单独创建一个数据库连接实例是最理想的。
     

可以确定的是ado.net connection 是非线程安全的 一个连接下一次open close 过程不允许并发,并且多次open close并发会相互冲突 (想并发只能通过锁来控制了,但这个不用想肯定效率不高)。

      而mongodb 则在这方面具有优势, mongo是线程安全的。一个连接下是允许并行写入操作的,同样mongodb 可以多连接并发,然后每个连接下又可以多并发写入操作,这样每秒并写入记录数可以更高。mongodb的池,是预先创建指定数量的闲置连接,用到其中的连接的时候,该转为活动状态。经过这两天测试,mongodb的单连接的并行写入效率没有并行多连接写入的效率高。推测mongodb的单连接并行写入也采用了写锁或者队列,效率上可能低于多连接操作。因此在合理的并行线程内,合适的并行连接数写入很重要。

由此可见,不同的数据库池的设计理想有所不同。

而ado.net 写入并发实现只有下面两种合适的
一 有池-单连接 单打开  并发写入(引及写入锁) (锁的引入,反而导致速度下降,这个方案排除了)

二 无池-并发多连接   单打开                   这种不推荐 
二 有池-并发多连接   单打开/多打开          目前,测试只有这种情最理想

另外建议连接池的minpoolsize 要设置(不设置或设置为零,会在一定时间内关闭池内所有连接)但不要设置太高,否则会占用太多资源。详细可查看MSDN介绍。

在微软的Petshop以及很多开源项目曾经看到的SQLHelper此类的数据库存操作类大都是静态的? 为什么呢,因为静态方法在不引用静态字段的前提下是线程安全的。静态字段是多线程共享的,而静态方法在每个线程是都有一个副本,只要静态方法不调用静态字段则是线程安全的,因此我们看到为何SQL 单连接的情况都是使用静态方法,可以防止单连接并发操作。

转载于:https://www.cnblogs.com/mecity/archive/2011/10/18/2217091.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C、C++基础】什么时候用 “.” 什么时候用“->”(3个实例搞懂)

从堆栈的角度来说: 从堆栈的角度来说: 对象放在堆上,就要用指针,也就是对象指针->函数; 放在栈上,就对象.函数 那么如何判断对象放在堆上还是栈上? 从我的另一篇笔记【C grammar】C简化内存模型可知&am…

java clone方法_Java Calendar clone()方法与示例

java clone方法日历类clone()方法 (Calendar Class clone() method) clone() method is available in java.util package. clone()方法在java.util包中可用。 clone() method is used to return the cloned object of this Calendar object. clone()方法用于返回此Calendar对象…

三、Numpy数组操作

一、对图片各个像素点的像素值进行操作 image.shape[0]:image图像的height image.shape[1]:image图像的width image.shape[2]:image图像的channels import cv2 import numpy as npdef access_pixels(image):print(image.shape)height imag…

picacg服务器维护,picacg的服务器地址是什么

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器,帮助用户打造可靠、安全、灵活、高效的应用环境,确保服务持久稳定运行,提升运维效率三年低至5折,多种配置可选了解详情用户数据注…

Redis-Sampler:深入了解你的Redis存储

redis-sampler 是Redis作者antirez 同学开发的一个ruby 小工具,用于对Redis存储概况进行抽样检测并给出分析结果。 项目地址:https://github.com/antirez/redis-sampler 使用方式: 下载源码,执行下面命令: ./redis-sam…

二叉树笔记(深度遍历与广度遍历+13道leetcode题目(深度3道、广度10道))

本文章为结合leetcode题目以及公众号“代码随想录”的文章所做的笔记! 感觉代码随想录的题目整理真的很好,比自己盲目刷题好很多。 目录1、二叉树小记1、满二叉树与完全二叉树2、二叉搜索树3、平衡二叉搜索树AVL4、二叉树存储方式5、二叉树遍历方式6、二…

ZZ的计算器

Problem Description ZZ自从上大学以来,脑容量就是以SB计算的,这个吃货竟然连算术运算也不会了,可是当今的计算机可是非常强大的,作为ACMer, 几个简单的算术又算得了什么呢?可是该怎么做呢?ZZ只…

kotlin 覆盖属性_Kotlin程序| 方法覆盖的示例

kotlin 覆盖属性方法重载 (Method Overriding) Method overriding allows derived class has the same function name and signature as the base class 方法重写允许派生类具有与基类相同的函数名称和签名 By method overriding we can provide different implementation into…

对视频中的特征颜色物体(青色水杯)进行跟踪

方法一:目标物体白色,其余黑色 import cv2 import numpy as npdef extrace_object():capture cv2.VideoCapture("G:/Juptyer_workspace/study/data/yy.mp4")while(True):ret,frame capture.read()if retFalse:breakhsv cv2.cvtColor(frame…

Android实现号码归属地查询

我们通过发送XML访问 WebService就可以实现号码的归属地查询,我们可以使用代理服务器提供的XML的格式进行设置,然后请求提交给服务器,服务器根据请求就会返回给一个XML,XML中就封装了我们想要获取的数据。 发送XML 1.通过URL封装路…

如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter...

一、如何从 Datagrid 中获得单元格的内容 DataGrid 属于一种 ItemsControl, 因此,它有 Items 属性并且用ItemContainer 封装它的 items. 但是,WPF中的DataGrid 不同于Windows Forms中的 DataGridView。 在DataGrid的Items集合中,DataGridRow…

【C++ grammar】常量、指针、Usage of using, typedef, and #define

目录1、常量 (Constant)2、指针(Pointer)3、Usage of using, typedef, and #define1、常量 (Constant) 常量是程序中一块数据,这个数据一旦声明后就不能被修改了。 如果这块数据有一个名字&am…

斯威夫特山地车_斯威夫特| 两个数字相加的程序

斯威夫特山地车In this program, we will have an idea - how two numbers can be added and displayed as the output on the screen? 在此程序中,我们将有一个想法- 如何将两个数字相加并显示为屏幕上的输出 ? Open XCode terminal and type the fol…

四、色彩空间

一、色彩空间 1、什么是色彩空间? 色彩空间是定义的颜色范围。 2、常见的色彩空间有哪些? ①RGB ②HSV 在OpenCV中,Hue的值为0~180,之所以不是360是因为,8位存不下,故进行归一化操作,使得H…

Oracle LOB 详解

一. 官方说明Oracle 11gR2 文档:LOB Storagehttp://download.oracle.com/docs/cd/E11882_01/appdev.112/e18294/adlob_tables.htm#ADLOB45267Oracle 10gR2 文档:LOBs in Tableshttp://download.oracle.com/docs/cd/B19306_01/appdev.102/b14249/adlob_t…

FIFA的完整形式是什么?

国际足联:国际足球联合会 (FIFA: Federation Internationale de Football Association) FIFA is an abbreviation of the "Federation Internationale de Football Association" in French. It is also known as the International Federation of Associa…

POJ 1654 Area

题意:从原点出发,沿着8个方向走,每次走1个点格或者根号2个点格的距离,最终回到原点,求围住的多边形面积。分析:直接记录所经过的点,然后计算多边形面积。注意,不用先保存所有的点&am…

【C++ grammar】重载、内联、变量作用域、带默认参数的函数

目录1、变量的作用域1. 变量的作用域分类2. Unary Scope Resolution (一元作用域解析运算符)2、重载函数3、带有默认参数值的函数4、重载函数 VS 带有默认参数值的函数5、内联函数(Inline Function)1. 普通函数的优缺点2. 使用内联函数3. 定义内联函数4.…

五、像素运算

一、相关概念 1、算术运算 Ⅰ加减乘除 Ⅱ调节亮度 Ⅲ调整对比度 2、逻辑运算 Ⅰ与或非 Ⅱ遮罩层控制 二、图像算术运算(加减乘除均值方差) 其中图像的加减乘除需要保证两张图像的大小相同 import cv2 import numpy as npdef add(src1,src2):dst cv2.add(src1,src2)cv2.im…

创建bootstrap项目_使用Bootstrap创建第一个网页

创建bootstrap项目使用Bootstrap创建第一个网页 (Create First Webpage with Bootstrap) In the previous article, we learned "how to setup bootstrap?" for a web project. If you haven’t gone through that, it is recommended to read it. Now, in this art…