我需要创建一个到数据库的连接池,可以在Flask中通过请求重用。文档(0.11.x
)建议使用g
,即应用程序上下文来存储数据库连接。
问题是在每个请求之前和之后创建和销毁应用程序上下文。因此,对创建的连接数没有限制,并且没有连接被重用。我正在使用的代码是:
def get_some_connection():
if not hasattr(g, 'some_connection'):
logger.info('creating connection')
g.some_connection = SomeConnection()
return g.some_connection
并关闭连接
@app.teardown_appcontext
def destroy_some_connection(error):
logger.info('destroying some connection')
g.some_connection.close()
这是故意的,也就是说,烧瓶每次都想创建一个新连接,或者在我的代码中使用应用程序上下文存在一些问题。此外,如果它的故意是有一个解决方法,以使连接全局。我知道,一些旧的扩展程序会保留app['extension']
本身的连接。
答案 0 :(得分:3)
不,您必须拥有某种全局连接池。 g
允许您在请求之间共享状态,因此在调用处理请求的各种模板和函数之间,而不必传递全局'周围的状态,但它并不意味着替换模块全局变量(与模块具有相同的生命周期)。
您当然可以将数据库连接设置为g
以确保所有请求代码仅使用一个连接,但您仍然可以从(模块)全局池中提取连接。
我建议您为每个线程创建连接 并汇总它们。您可以从头开始构建(也许使用threading.local
对象),或者您可以使用SQLAlchemy这样的项目,它带有优秀的连接池实现。这基本上是Flask-SQLAlchemy extension所做的。