Postgresql “如何修复”;OperationalError:(psycopg2.OperationalError)服务器意外关闭了连接; 服务
我的服务基于flask+postgresql+gunicorn+supervisor+nginx 当docker部署时,在运行服务之后,然后访问api,有时会显示错误消息,有时会运行良好 sqlachemyconnect数据库添加参数Postgresql “如何修复”;OperationalError:(psycopg2.OperationalError)服务器意外关闭了连接; 服务,postgresql,macos,docker,flask,Postgresql,Macos,Docker,Flask,我的服务基于flask+postgresql+gunicorn+supervisor+nginx 当docker部署时,在运行服务之后,然后访问api,有时会显示错误消息,有时会运行良好 sqlachemyconnect数据库添加参数'sslmode:disable' File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection R
'sslmode:disable'
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
Return connection._execute_clauseelement(self, multiparams, params)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
Distilled_params,
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1248, in _execute_context
e, statement, parameters, cursor, context
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception
Util.raise_from_cause(sqlalchemy_exception, exc_info)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 383, in raise_from_cause
Reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context
Cursor, statement, parameters, context
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
Cursor.execute(statement, parameters)
OperationalError: (psycopg2.OperationalError) server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
问询处
Mac Docker:版本:2.0.0.3(31259)
macOS:版本10.14.2
Python:版本2.7.15
递推法
当通过命令查看端口信息时
lsof -i:5432
端口5432是postgresql数据库的默认端口,如果outputconsole是
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postgres 86469 user 4u IPv6 0xxddd 0t0 TCP *:postgresql (LISTEN)
postgres 86469 user 5u IPv4 0xxddr 0t0 TCP *:postgresql (LISTEN)
它将显示错误消息:
OperationalError: (psycopg2.OperationalError) server closed the connection unexpectedly
但如果outputconsolelog显示:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
com.docke 62421 user 26u IPv4 0xe93 0t0 TCP 192.168.2.7:6435->192.168.2.7:postgresql (ESTABLISHED)
postgres 86460 user 4u IPv6 0xed3 0t0 TCP *:postgresql (LISTEN)
postgres 86460 user 5u IPv4 0xe513 0t0 TCP *:postgresql (LISTEN)
postgres 86856 user 11u IPv4 0xfe93 0t0 TCP 192.168.2.7:postgresql->192.168.2.7:6435 (ESTABLISHED)
在这种情况下,api将运行良好
因为mac的Docker?
参考链接,这个问题不能解决我的问题
注意到类似的问题了吗?
参考链接
这个问题也不能解决我的问题
解决方案
sqlalchemy.orm的逻辑相同,(顺便说一句,flask_sqlalchemy基于该逻辑) 可以设置更多保护策略,如文档中所述: 例如,以下是我的引擎实例化:
engine = sqlalchemy.create_engine(connection_string,
pool_size=10,
max_overflow=2,
pool_recycle=300,
pool_pre_ping=True,
pool_use_lifo=True)
sqlalchemy.orm.sessionmaker(bind=engine, query_cls=RetryingQuery)
对于重试查询代码,cf:基于答案中的解决方案和@MaxBlax360答案中的信息。我认为在Flask SQLAlchemy中设置这些配置值的正确方法是设置
app.config['SQLAlchemy\u ENGINE\u OPTIONS']
:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# pool_pre_ping should help handle DB connection drops
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {"pool_pre_ping": True}
app.config['SQLALCHEMY_DATABASE_URI'] = \
f'postgresql+psycopg2://{POSTGRES_USER}:{dbpass}@{POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DBNAME}'
db = SQLAlchemy(app)
我的数据库配置:
app = Flask(__name__)
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {"pool_pre_ping": True}
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URL']
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# Play with following options:
app.config['SQLALCHEMY_POOL_SIZE'] = 10
app.config['SQLALCHEMY_MAX_OVERFLOW'] = 20
app.config['SQLALCHEMY_POOL_RECYCLE'] = 1800
db = SQLAlchemy(app)
我正在发布我自己的答案,因为上面没有提到我的特定设置(Postgres 12.2,SQLAlchemy 1.3) 要停止
操作错误
s,我必须将一些额外的连接参数
传递到创建引擎
:
创建引擎(
连接字符串,
pool_pre_ping=真,
连接参数={
“keepalives”:1,
“保持空闲”:30,
“keepalives_间隔”:10,
“keepalives_count”:5,
}
)
如果您使用的是Python3,可能是因为谢谢,但我使用的是Python2.7。15@ygesher我在python3中也面临着类似的问题。我使用的是psycopg2==2.8.3和SQLAlchemy==1.3.7。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# pool_pre_ping should help handle DB connection drops
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {"pool_pre_ping": True}
app.config['SQLALCHEMY_DATABASE_URI'] = \
f'postgresql+psycopg2://{POSTGRES_USER}:{dbpass}@{POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DBNAME}'
db = SQLAlchemy(app)
app = Flask(__name__)
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {"pool_pre_ping": True}
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URL']
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# Play with following options:
app.config['SQLALCHEMY_POOL_SIZE'] = 10
app.config['SQLALCHEMY_MAX_OVERFLOW'] = 20
app.config['SQLALCHEMY_POOL_RECYCLE'] = 1800
db = SQLAlchemy(app)