Postgresql “如何修复”;OperationalError:(psycopg2.OperationalError)服务器意外关闭了连接; 服务

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

我的服务基于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
    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)