flask 使用sqlalchemy连接postgreSQL,长期无活动,出现异常断开的解决方案

后端长时间无数据库请求后,第一次恢复请求会报错,错误信息是这样的:

sqlalchemy.exc:OperationalError: (psycopg2.OperationalError) server closed the connection unexpectedly This probably
means the server terminated abnormally before or while processing the request.[SQL: SELECT visitor."ID" AS "visitor_ID",
 visitor.username AS visitor_username, visitor.visits AS visitor_visits FROM visitor](Background on this error at: http://sqlalche.me/e/e3q8)

这篇文章说的比较清楚了——数据库对长时间idle的连接有超时关闭的处理机制,sqlalchemy的连接池也有超时释放的处理机制。

当连接池的超时时间长于数据库的连接超时时间时,可能出现数据库已经关闭一个连接,而客户端还以为这个连接仍然有效的情况。

查了一下postgresql的超时时间默认值:

archive_timeout
控制服务器周期性地切换到一个新的 WAL 段文件,通俗的讲,就是定时归档。
authentication_timeout
完成服务器认证的最长时间,如果在这个时间内没有完成认证,服务器将关闭连接。
checkpoint_timeout
自动 WAL 检查点之间的最长时间,增大这个参数会使数据库崩溃后恢复的时间加长。
deadlock_timeout
进行死锁检测之前在一个锁上等待的总时间
idle_in_transaction_session_timeout
空闲事务超时。终止任何已经闲置超过这个参数所指定的时间(以毫秒计)的打开事务的会话。 这使得该会话所持有的任何锁被释放,并且其所持有的连接槽可以被重用, 它也允许只对这个事务可见的元组被清理。
lock_timeout
锁等待超时。语句在试图获取表、索引、行或其他数据库对象上的锁时等到超过指定的毫秒数,该语句将被中止。不推荐在postgresql.conf中设置。
statement_timeout
控制语句执行时长,单位是ms。超过设定值,该语句将被中止。
不推荐在postgresql.conf中设置,如非要设置,应该设置一个较大值。
wal_receiver_timeout
中止处于非活动状态超过指定毫秒数的复制链接。这对于正在接收的后备服务器检测主服务器崩溃或网络断开有用。设置为0会禁用超时机制。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。默认值是 60 秒。
wal_sender_timeout
中断那些停止活动超过指定毫秒数的复制连接。这对发送服务器检测一个后备机崩溃或网络中断有用。设置为0将禁用该超时机制。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。默认值是 60 秒。
————————————————
版权声明:本文为CSDN博主「数据库人生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ctypyb2002/article/details/79548630

暂时还没有找到connect_timeout 的默认时间是从哪儿来的。

数据库端没有这个选项。

在libpq的源码里面也没有找到这个变量有默认设置 。

libpq-int.h

fe-connect.c

typedef struct _PQconninfoOption
{
        char       *keyword;            /* The keyword of the option                    */
        char       *envvar;                     /* Fallback environment variable name   */
        char       *compiled;           /* Fallback compiled in default value   */
        char       *val;                        /* Option's current value, or NULL               */
        char       *label;                      /* Label for field in connect dialog    */
        char       *dispchar;           /* Indicates how to display this field in a
                                                                 * connect dialog. Values are: "" Display
                                                                 * entered value as is "*" Password field -
                                                                 * hide value "D"  Debug option - don't show
                                                                 * by default */
        int                     dispsize;               /* Field size in characters for dialog  */
} PQconninfoOption;
{"connect_timeout", "PGCONNECT_TIMEOUT", NULL, NULL,
        "Connect-timeout", "", 10}, /* strlen(INT32_MAX) == 10 */

psycopg2的源码里面也没有找到…

暂时先不找了。

3.0版本的sqlclchemy_engine设置方法如下。

It seems that some connections were kept by SQLAlchemy for too long. I lowered the POOL_RECYCLE_TIME to 10 minutes and updated the settings format to avoid deprecation that will be introduced in version 3.0 of Flask-SQLAlchemy.

DB_POOL_SIZE = int(os.environ.get('DB_POOL_SIZE', '10'))
DB_POOL_RECYCLE = int(os.environ.get('DB_POOL_RECYCLE', '60'))
SQLALCHEMY_ENGINE_OPTIONS = {
    'pool_size': DB_POOL_SIZE,
    'pool_recycle': DB_POOL_RECYCLE,
}

Original: https://blog.csdn.net/qq_39597358/article/details/115444743
Author: Goodwillie
Title: flask 使用sqlalchemy连接postgreSQL,长期无活动,出现异常断开的解决方案

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/747982/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python实例:小游戏20148

    本节教程通过 2048 的小游戏快速、完整地呈现了使用 Python 语言编程的过程,将之前介绍的内容有机地结合在了一起 。2048是一款流行于手机、平板等终端设备上的益智小游戏,…

    Python 2023年9月25日
    049
  • sqlserver字符串转日期_关于日期特征,你想知道操作都在这儿

    来源:SAMshare 今日锦囊 特征锦囊:关于日期特征,你想知道操作都在这儿~ ? Index 字符串转日期 日期转字符串 13位的时间戳转 日期格式str 13位的时间戳转da…

    Python 2023年8月16日
    067
  • windows 中安装pygame模块

    首先下载python,自己去官网下载安装好,相关教程有很多,就不重复了python3.5以上自带了pip,如果是以下版需要下载pip可以自己在安装的python文件下看,比如&#8…

    Python 2023年9月24日
    031
  • Django初识上

    超文本传输协议,目的是为了提供一种发布 Web及接收 Web页面数据的方法;常用端口为 80;过程:客户端首先通过 80端口向 HTTP服务端发起请求,建立 TCP连接,之后进行 …

    Python 2023年8月6日
    035
  • wireshark一开,无线网络就断开

    最近在研究wireshark 笔记本连着wifi,开始抓包后,无线网就断了 查了半天,需要把捕获–>选项里的监控模式去掉就行了 Original: https:/…

    Python 2023年6月3日
    089
  • python数据保存:记录pandas数据分析完成后的轻量级数据保存!

    本文说的轻量级的数据保存指的是sqlite,比如一些手机App的操作都会采用该数据库来完成对数据保存。 一个sqlite数据库的大小在KB之间,pandas模块提供的DataFra…

    Python 2023年11月5日
    063
  • django channels 的使用和配置 以及实现简单的群聊

    1.1WebSocket原理 http协议 连接 数据传输 断开连接 websocket协议,是建立在http协议之上的。 连接,客户端发起。 握手(验证),客户端发送一个消息,后…

    Python 2023年8月6日
    056
  • 手把手教你做一个天猫精灵(四)

    上一章讲到如何将程序写入到ESP8266 WiFi模块中,实现物联网终端对硬件的控制。本章将通过fubuki-iot实现自定义硬件控制。同时给出一个替代百度API的方案。 (无) …

    Python 2023年10月31日
    039
  • Python视频处理(2)——Flask网页开发+分镜

    目录 一、主程序基本结构 1、安装并导入Flask 2、创建Flask对象(很重要的一步,不能忘记) 3、编写主程序 4、路由 5、完整代码 二、渲染网页 三、定义分镜相关函数 1…

    Python 2023年8月10日
    047
  • Matplotlib中subplot以及subplots的用法

    subplot 概述 matplotlib能够绘制精美的图表,但我们希望把一组图表放在一起进行比较,这时我们就需要用到subplot。 用法 plt.subplot()创建一个画像…

    Python 2023年9月2日
    070
  • Python 列表解析式竟然支持异步?

    PEP标题:PEP 530 — Asynchronous Comprehensions PEP作者:Yury Selivanov 创建日期:2016-09-03 合入版…

    Python 2023年6月9日
    062
  • python datetime和字符串如何相互转化?

    python datetime和字符串如何相互转化? 原创 CorwinPC2022-07-18 17:35:20博主文章分类:Python ©著作权 文章标签 python 开发…

    Python 2023年5月25日
    086
  • 懒人python操作,代码中永远只需要导入一个库

    Pyforest是一个开源的Python库,可以自动导入代码中使用到的Python库。 【阅读全文】 实话说,作为一个程序员还是得不停的学习呀。昨天晚上睡觉之前就在论坛上面溜达了一…

    Python 2023年11月2日
    057
  • mysql8.0安装脚本

    Python 2023年5月24日
    093
  • 浅探ChatGPT

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年11月3日
    053
  • Python之Pandas isnull检查是否有缺失值

    1.df.isnull() 元素级别的判断,把对应的所有元素的位置都列出来,元素为空或者NA就显示True,否则就是False train.isnull() 2,df.isnull…

    Python 2023年8月8日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球