zoukankan      html  css  js  c++  java
  • 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,即瞬时完成,不等服务器回应,而MongoClient()默认是safe=True,即安全操作,等服务器确认后才继续下一步操作。
    所以一个8秒,一个62秒,这个差距实际上是“瞬时完成”与“安全操作”两者的性能差别。
    当将Connection() 和MongoClient()建立连接时指定相同的safe参数,两者的性能表现是一样的。

    client = MongoClient('192.168.1.101', 27017,safe=False)

    ---------------------
    作者:djd已经存在
    来源:CSDN
    原文:https://blog.csdn.net/djd1234567/article/details/47859015
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    170815、redis3.0安装配置
    170814、Java使用gzip压缩文件、还原文件
    170811、Java获取jdk系统环境变量
    170810、spring+springmvc+Interceptor+jwt+redis实现sso单点登录
    加密概述
    软件测试入门第02天:基础理论知识
    软件测试入门第01天:综述
    【心路历程】永远热泪盈眶
    Linux部署Django:报错 nohup: ignoring input and appending output to ‘nohup.out’
    【WEB】jQuery 判断复选框是否选中
  • 原文地址:https://www.cnblogs.com/ExMan/p/10790928.html
Copyright © 2011-2022 走看看