无法为Flask_sqlalchemy设置池大小

时间:2018-10-26 16:38:28

标签: python python-3.x flask sqlalchemy flask-sqlalchemy

我想将sqlalchemy池大小设置为默认值以外的值。

我有一个Flask应用。 我使用以下文件从文件中设置配置     app.config.from_pyfile('config.py')

在初始化数据库之前,我已经转储了配置,其中包括:

'SQLALCHEMY_DATABASE_URI': 'mysql://readonly:password@localhost/xyz',
'SQLALCHEMY_ECHO': False,
'SQLALCHEMY_MAX_OVERFLOW': 0,
'SQLALCHEMY_POOL_SIZE': 1,
'SQLALCHEMY_RECORD_QUERIES': False,
'SQLALCHEMY_TRACK_MODIFICATIONS': False, 

在加载配置并执行转储之后,我们正在调用一些代码,例如:

db: SQLAlchemy = SQLAlchemy()
db.init_app(app)

我正在mod_python上用一个进程和一个线程在apache上运行它。 我在httpd.conf

中使用它
WSGIDaemonProcess browse user=busybody group=busybody processes=1 threads=1 lang='en_US.UTF-8' locale='en_US.UTF-8' python-home=/users/x/virtualenvs/browse-wfalcMKM home=/users/x/browse
WSGIScriptAlias /abs /users/e-prints/browse/wsgi.py/abs

然后我用围攻和100个并发连接对其进行锤击。

我在mysql SHOW PROCESSLIST中为用户“只读”获得20个进程;我希望看到的是SHOW PROCESSLIST中用户“只读”的1个过程;

没有其他应用程序使用用户“只读”,并且当我停止httpd / python / flask应用程序时,SHOW PROCESSLIST中的零个“只读”用户;

我希望根据此处的文档以尝试的方式配置事物:http://flask-sqlalchemy.pocoo.org/2.3/config/

我正在使用python 3.6和mysql 5.1.73。看来我有Flask_SQLAlchemy 2.3.2,mysqlclient 1.3.13和SQLAlchemy 1.2.12。这是在Linux上。带有mod-wsgi 4.5.15的Apache。

更新:

我添加了一个调试程序,并且看到db.engine.pool.size设置为我期望的值。

我不确定这是否应该工作,但是我发现我在不同的请求中得到了不同的池对象:

[Mon Oct 29 12:17:25 2018]  - ERROR: "pool size = 1"
[Mon Oct 29 12:17:25 2018]  - ERROR: "engine object = Engine(mysql://browse_readonly:***@localhost/arXiv?charset=utf8)"
[Mon Oct 29 12:17:25 2018]  - ERROR: "pool object = <sqlalchemy.pool.QueuePool object at 0x7f2342b97da0>"

[Mon Oct 29 12:17:35 2018]  - ERROR: "pool size = 1"
[Mon Oct 29 12:17:35 2018]  - ERROR: "engine object = Engine(mysql://browse_readonly:***@localhost/arXiv?charset=utf8)"
[Mon Oct 29 12:17:35 2018]  - ERROR: "pool object = "sqlalchemy.pool.QueuePool object at 0x7f2342b39400>"

更新2:我正在使用apache和mod-python。我将其添加到上述问题的主体中。 更新3:我的错误,我们正在使用mod-wsgi。

2 个答案:

答案 0 :(得分:1)

您正在正确设置池大小。但是您几乎可以肯定有多个单独的WSGI进程:

  

我不确定这是否应该工作,但是我发现我在不同的请求中得到了不同的池对象:

[...]  
[Mon Oct 29 12:17:25 2018]  - ERROR: "pool object = <sqlalchemy.pool.QueuePool object at 0x7f2342b97da0>"

[...]
[Mon Oct 29 12:17:35 2018]  - ERROR: "pool object = "sqlalchemy.pool.QueuePool object at 0x7f2342b39400>"

Flask-SQLAlchemy在每个Flask应用程序设置中使用简单的单引擎单池处理,这是通过拥有多个QueuePool实例而拥有多个Flask实例的唯一方法,更多奇特的多应用程序设置意味着您正在多进程WSGI服务器中提供该应用程序。

WSGI服务器通常与线程一起使用多个工作进程来提高性能。每个工作进程都是独立的,并且有自己的Flask实例,每个实例都有自己的SQLAlchemy引擎和池。这取决于您的确切WSGI服务器如何配置它以仅使用线程。

否则,正常情况是单独的进程需要它们自己的MySQL连接。

答案 1 :(得分:0)

使用引擎创建引擎时肯定可以设置CONNECTION_POOL_SIZE

app.config['SQLALCHEMY_POOL_SIZE'] = 1
db = SQLAlchemy(app)

可以确认它曾经与之合作

print("pool size = {}".format(db.engine.pool.size()))

在创建引擎之后,无法更改某些配置参数,因此问题可能出在,您正在使用db = SQLAlchemy()创建引擎,然后再应用配置。但这还不是全部,因为默认池大小为5,并且如果您看到20个并发连接,那么肯定还有其他事情。