首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以持久和线程安全的方式处理大容量的MongoDB项目中的连接?

问如何以持久和线程安全的方式处理大容量的MongoDB项目中的连接?
EN

Stack Overflow用户
提问于 2019-12-28 21:36:53
回答 1查看 1.4K关注 0票数 3

我有一个跨多个模块的大型Flask项目。我希望所有这些模块都能访问我的MongoDB (PyMongo)数据库连接。根据最佳实践,我希望精确地在整个应用程序(即所有模块)中保持一个连接池。

不可行的解决方案(来自其他相关的StackOverflow答案)

  1. 我不能创建一个全局变量并将其传递给我调用的每个模块,因为这不是线程安全的(特别是当我的db对象不是只读的时候)。示例如下。
  2. I不能为每个请求创建一个新连接,因为它不能使用Flask.g“全局”变量,因为它与每个请求一起被删除,使得它基本上等同于第2点。
  3. 我不能简单地将数据库连接代码放入一个新模块(如config.py),并在需要时从其他模块调用它,因为每当我从不同的模块调用它时,我都会创建新的连接。

问题

  1. 如何以线程和进程安全的方式创建单个和持久 MongoDB连接?
  2. 如何跨模块提供对此的访问权?换句话说,如何使其跨模块具有全局性?
  3. ,这方面没有最佳实践吗?这些文献要么已经过时,要么根本不存在。请回答MongoDB (特别是PyMongo,如果可能)。

示例

这是我如何创建全局变量并跨模块使用它的一个最起码的工作示例(在“不可行的解决方案”中的第1点)。

main.py

代码语言:javascript
复制
from module1 import helper_function

app = Flask(__name__)
db = new_db_connection()

@app.route('/page1'):
def page1():
    db_return = db.query1()
    db.cache = new_value # this makes this entire code thread-unsafe
    return db_return

@app.route('/page2'):
def page2():
    db_return = db.query2()
    db_return2 = helper_function(db) # doesn't seem right that I have to pass this object around all the time
    return db_return

模1.py

代码语言:javascript
复制
def helper_function(db):
    db_return = db.query3()
    return db_return
EN

回答 1

Stack Overflow用户

发布于 2020-01-01 18:23:31

我一直在同一条船上,我想出的答案是向每个函数传递一个参数。如果有更好的方法我很想知道。

实际上,我不是传递db值,而是传递一个自定义上下文对象,该对象具有mongoclient以及其他一些有用的方法(例如记录结果ids等)。

代码语言:javascript
复制
class Context:

    def __init__(self, cs: str = None) -> None:
        self.cs = cs

        try:
            self.db = pymongo.MongoClient(self.cs).get_database()
        except Exception as e:
            raise ValueError(f'Failed to connect to server using connection string {self.cs}')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59515070

复制
相关文章

相似问题

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