首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PyMongo瓶应用中的慢度

PyMongo瓶应用中的慢度
EN

Stack Overflow用户
提问于 2022-07-05 20:06:08
回答 1查看 50关注 0票数 2

我正在开发一个基本的烧瓶应用程序来接收用户的输入请求并将其插入到MongoDB Atlas集群中。

我有一条路线/save,它是POST类型的。这个端点接收请求,建立一个新的mongo连接,插入到mongo,最后关闭连接。这种方法是慢速,即使我只尝试插入一个文档,响应延迟平均为700-800 ms。

注:我的用例没有意义使用大容量插入。

样本码

代码语言:javascript
复制
app = Flask(__name__)
app.logger.setLevel(logging.INFO)

DBNAME = 'DBNAME as String'
CONNSTRING = 'CONNECTION as String'

class mongoDB:
    def __init__(self):
        try:
            self.client = MongoClient(CONNSTRING, maxPoolSize=None)
            self.database = self.client[DBNAME]
            app.logger.info('Mongo Connection Established')
        except Exception as e:
            app.logger.warning('Mongo Connection could not be established')
            app.logger.warning('Error Message: ' + str(e))

    def close_connection(self):
        try:
            self.client.close()
        except Exception as e:
            app.logger.warning('connection failed to close')
            app.logger.warning('Error Message: ' + str(e))

@app.route('/save', methods=['POST'])
def save():
    data_info = flask.request.get_json()
    
    try:
        db = mongoDB()
        image_collection = db.database['DUMMY_COLLECTION']
        image_collection.insert_one({'VALUE_ID' : data_info['value1'], 'VALUE_STRING' : data_info['value2']})
        app.logger.info('Inserted Successfully')
        return {'message': 'Success'}, 200, {'Content-Type': 'application/json'}
    except Exception as e:
        app.logger.error('Error Adding data to Mongo: ' + str(e))
        return {'message': 'Error'}, 500, {'Content-Type': 'application/json'}
    finally:
        db.close_connection()
        app.logger.info('connection closed')

if __name__ == '__main__':
    app.run()

但是,如果我在应用程序初始化时建立了Mongo连接,并且保持其打开,并且从未关闭该连接,则延迟将降至70-80 of。

请有人帮助理解保持一个开放连接的后果,而不是与每个请求建立一个新的连接?或者有什么方法可以在打开多个连接的情况下减少延迟?

注意:保持多个连接方法,我尝试使用writeConcern=0、maxPoolSize=None和journal=False,但所有这些都没有大大改善延迟。

任何帮助都将不胜感激。谢谢

EN

Stack Overflow用户

发布于 2022-07-05 21:24:11

MongoClient(CONNSTRING, maxPoolSize=None)不仅仅是一个连接,而是一个连接池。这意味着已经有了该对象,您可以有多个并发请求到MongoDB。通过设置maxPoolSize=None,您可以使它们无限(这可能在重载下产生一些影响)。

为每个请求创建一个连接池是一种反模式(正如您在高延迟时所认识到的那样),原因是每次创建连接池和与数据库握手的成本都需要支付。

最好的方法是在启动时启动一个,然后维护它。这意味着您应该处理在发生DB或网络故障时可能出现的所有异常。但是,我假设大多数事情已经由MongoClient处理了。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72874989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档