我想将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。
答案 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个并发连接,那么肯定还有其他事情。