pymongo中的连接操作:Connection()与MongoClient()

class MongoClient(pymongo.common.BaseObject)
   Connection to MongoDB.

   Method resolution order:
       MongoClient
       pymongo.common.BaseObject
       __builtin__.object
class Connection(pymongo.mongo_client.MongoClient)
   Connection to MongoDB.

   Method resolution order:
       Connection
       pymongo.mongo_client.MongoClient
       pymongo.common.BaseObject
       __builtin__.object

我们先看一下源代码,从这两个类的继承来看,connection是继承了MongoClient的,建议使用MongoClient而不是使用Connection。

(也就是说,MongoClient能够用法Connection都能够使用)

from pymongo import MongoClient
client = MongoClient(‘192.168.40.87‘, 27037)
db_name = ‘TCL_Useraction‘
db = client[db_name]
collection_useraction = db[‘useraction‘]

这里是通过字典的方式訪问数据库和集合,同一时候你也能够通过.(点号)的方式訪问

做实验时。发现Python用Connection()连接时。改动操作速度非常快。而用MongoClient()建立的连接,操作速度慢非常多。

from pymongo import MongoClient,Connection
import time
db = Connection(‘192.168.1.101‘, 27017).performance_test
#client = MongoClient(‘192.168.1.101‘, 27017)
#db = client.performance_test 

db.drop_collection("updates")
collection = db.updates
collection.insert({"x": 1})
collection.find_one()
start = time.time()
for i in range(100000):
        collection.update({}, {"$push" : {"x" : 1}})
...

>python test_mongo_conn.py
8.43799996376
>python test_mongo_client.py
62.5780000687

用Connection() 8秒,MongoClient()则花了62秒。这性能相差也太多了。

非常是疑惑,于是查了pymongo的文档,原来两者有个选项的默认行为不同:

class pymongo.connection.Connection([host=‘localhost‘[,port=27017[,max_pool_size=10[,network_timeout=None[, document_class=dict[, tz_aware=False[, **kwargs]]]]]]])

Write Concern options:

safe: Connection disables acknowledgement of write operations. Use safe=True to enable write acknowledgement.

w: (integer or string) If this is a replica set, write operations will block until they have been replicated to the specified number or tagged set of servers. w=<int> always includes the replica set primary (e.g. w=3 means write to the primary and wait until
replicated to two secondaries). Implies safe=True.

wtimeout: (integer) Used in conjunction with w. Specify a value in milliseconds to control how long to wait for write propagation to complete. If replication does not complete in the given timeframe, a timeout exception is raised. Implies safe=True.

j: If True block until write operations have been committed to the journal. Ignored if the server is running without journaling. Implies safe=True.

fsync: If True force the database to fsync all files before returning. When used with j the server awaits the next group commit before returning. Implies safe=True.

safe选项决定操作是“瞬时完毕”与“安全操作”。connection()默认是safe=False,即瞬时完毕,不等server回应,而MongoClient()默认是safe=True。即安全操作,等server确认后才继续下一步操作。

所以一个8秒,一个62秒,这个差距实际上是“瞬时完毕”与“安全操作”两者的性能区别。

当将Connection() 和MongoClient()建立连接时指定同样的safe參数,两者的性能表现是一样的。

client = MongoClient(‘192.168.1.101‘, 27017,safe=False)
#db = Connection(‘192.168.1.101‘, 27017,safe=False).performance_test
时间: 2024-10-03 14:14:59

pymongo中的连接操作:Connection()与MongoClient()的相关文章

spark中各种连接操作以及实用方法

val a = sc.parallelize(Array(("123",4.0),("456",9.0),("789",9.0)) val b = sc.parallelize(Array(("123",8.0),("789",10))) val c = a.join(b) c.foreach(println) /* (123,(4.0,8.0)) (789,(9.0,10)) */ val d = a.c

Python Pymongo中Connection()与MongoClient()差异

在git找了几个blog的源码,在学习的过程中,发现有人使用Connection(),有人却在使用MongoClient(),那么到底两者有什么差别呢? 且看分析如下: db = Connection('192.168.1.101', 27017).performance_test #client = MongoClient('192.168.1.101', 27017) #db = client.performance_test db.drop_collection("updates"

虚拟机中MySQL连接问题:Lost connection to MySQL server at &#39;reading initial communication packet, system error: 0 以及 host is not allowed to connect mysql

环境:在VirtualBox中安装了Ubuntu虚拟机,网络使用了NAT模式,开启了端口转发. 局域网内其他计算机访问虚拟机中的MySQL Server出现两个问题: Lost connection to MySQL server at 'reading initial communication packet, system error: 0 以及 host is not allowed to connect mysql 1.解决Lost connection to MySQL server

php大力力 [024节]PHP中的字符串连接操作(2015-08-27)

2015-08-27 php大力力024.PHP中的字符串连接操作 PHP中的字符串连接操作  阅读:6185次   时间:2012-03-25 PHP字符串的连接的简单实例 时间:2013-12-30 很多时候我们需要将几个字符串连接起来显示,在PHP中,字符串之间使用“点”来连接,也就是英文中的句号”.”,具体使用方式如下 //定义字符串 $str1 = "Hello World!"; $str2 = "Welcome to HutaoW's BLOG!"; /

超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

我在玩webservice中遇到这个问题,情况是:(.net4.0)之前用的是好的,更新系统后出错.vs运行是好的,IIS运行出错..net底层抛错.换成.net2.0后完美运行.所以.net4.0出问题. ========================================================================================================= (转) 问题解决方法: 解决办法 1.在代码里面,把未关闭的连接关闭 2.扩大共

[bug]超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

引言 自己弄了一个小项目——日程管理系统,在初始化日期时,查询了数据库,每个日期就会查询一次数据库,就导致了这个问题. 问题 出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the

Java 连接操作 Redis 出现错误

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect at redis.clients.jedis.Connection.connect(Connection.java:207) at redis.clients.jedis.BinaryClient.connect

Entity Framework中的连接管理

EF框架对数据库的连接提供了一系列的默认行为,通常情况下不需要我们太多的关注.但是,这种封装,降低了灵活性,有时我们需要对数据库连接加以控制. EF提供了两种方案控制数据库连接: 传递到Context的连接: Database.Connnection.Open(): 下面详解. 传递到Context的连接 EF6之前版本 有两个接受Connection的构造方法: public DbContext(DbConnection existingConnection, bool contextOwns

连接字符串中Min Pool Size的理解是错误,超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

Min Pool Size的理解是错误的 假设我们在一个ASP.NET应用程序的连接字符串中将Min Pool Size设置为30: <add name="cnblogs" connectionString="Data Source=.;Initial Catalog=cnblogs;Min Pool Size=30" providerName="System.Data.SqlClient"/> 访问一下应用程序,然后用Windows