我正在使用Flask-SQLAlchemy和Postgre数据库开发Web应用程序,我的网页中有一个下拉列表,它从数据库中选择数据进行填充。在选择几次不同的值后,我遇到了"sqlalchemy.exc.TimeoutError:"错误。
我的软件包版本如下:
Flask-SQLAlchemy==2.5.1
psycopg2-binary==2.8.6
SQLAlchemy==1.4.15
我的数据库连接参数设置如下:
app.config['SQLALCHEMY_POOL_SIZE'] = 20
app.config['SQLALCHEMY_MAX_OVERFLOW'] = 20
app.config['SQLALCHEMY_POOL_TIMEOUT'] = 5
app.config['SQLALCHEMY_POOL_RECYCLE'] = 10
我收到的错误信息是:
sqlalchemy.exc.TimeoutError: QueuePool limit of size 20 overflow 20 reached, connection timed out, timeout 5.00 (Background on this error at: https://sqlalche.me/e/14/3o7r)
将'SQLALCHEMY_MAX_OVERFLOW'的值从20更改为100后,在下拉列表中进行了一些值更改后,我遇到了以下错误。
psycopg2.OperationalError: connection to server at "localhost" (::1), port 5432 failed: FATAL: sorry, too many clients already
每次从下拉列表中选择一个新值时,都会触发四个查询到数据库,并用这些查询结果填充HTML中的四个相应表格。
在每个查询到数据库之后,我都有一个“db.session.commit()”语句,但即使我这样做了,经过几次下拉列表的更改后,我仍然会遇到错误。
我知道我应该正确管理连接会话,但我一直在努力解决这个问题。我考虑将池超时设置为5秒,而不是默认的30秒,希望会话能以更快的方式关闭并返回池,但似乎没有帮助。
根据@snakecharmerb的建议,我检查了输出:
select * from pg_stat_activity;
在出现错误之前,我运行了10个不同的值的web应用程序,这意味着所有20 + 20个会话都被使用并处于“事务空闲”状态。
是否有任何想法或建议,我应该更改或查找什么?
db.session.commit()
没有关闭与数据库的连接(因此您的连接可能处于空闲
状态)。要关闭会话连接,您应该调用db.session.close()
。 - jorzel