我想将sqlalchemy池大小设置为默认值以外的值。
我有一个烧瓶应用程序。我使用app.config.from_pyfile('config.py')从文件文件中设置配置
在初始化db之前,我已经转储了配置,它包括:
'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)我用一个进程和一个线程在apache上运行mod_python。我在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显示PROCESSLIST中获得了20个用户“只读”进程;我希望看到的是显示PROCESSLIST中用户“只读”的一个进程;
没有其他应用程序使用用户“readonly”,当我停止httpd/python/烧瓶应用程序时,在节目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上。Apache与mod-wsgi 4.5.15。
更新:
我添加了一个调试,我看到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和。我在上述问题的正文中补充了这一点。更新3:我的错误,我们使用的是mod。
发布于 2018-10-30 12:03:48
您正在正确设置池大小。但是几乎可以肯定,您有多个独立的WSGI进程。
我不确定它是否应该这样工作,但我看到在不同的请求中得到了不同的池对象: -错误:“池对象= ”.-错误:"sqlalchemy.pool.QueuePool对象=“sqlalchemy.pool.QueuePool object at 0x7f2342b39400>”
烧瓶-SQLAlchemy使用一个简单的一个引擎和一个池的方式来安装一个QueuePool应用程序,只有这样,你才能通过拥有多个Flask实例来拥有多个Flask实例,这意味着你在一个多进程的WSGI服务器上为应用提供服务。
WSGI服务器通常使用多个工作进程与线程一起提高性能。每个工作进程都是独立的,并有自己的Flask实例,每个实例都有自己的SQLAlchemy引擎和池。这取决于您确切的WSGI服务器,您将如何将其配置为只使用线程。
否则,单独的进程需要自己连接到MySQL,这是正常的。
发布于 2018-10-27 21:25:56
在引擎创建时,绝对可以使用
app.config['SQLALCHEMY_POOL_SIZE'] = 1
db = SQLAlchemy(app)这可以被证实是与
print("pool size = {}".format(db.engine.pool.size()))一些配置参数在引擎创建后无法更改,因此问题可能是您正在使用db = SQLAlchemy()创建引擎,然后再应用配置。然而,这并不是整个故事的全部,因为默认池大小是5,如果您看到20个并发连接,那么肯定会有其他事情发生。
https://stackoverflow.com/questions/53013035
复制相似问题