当前位置: 首页 > article >正文

Peewee+Postgresql+PooledPostgresqlDatabase重连机制

需求:

Postgresql数据库服务重启后,需要业务代码正常读写数据库

方案:

  1. 通过继承playhouse.shortcuts.ReconnectMixin和playhouse.pool.PooledPostgresqlDatabase来创建一个新的ReconnectPooledPostgresqlDatabase类
  2. 修改reconnect_errors属性来适配Postgresql的错误类型
  3. 使用ReconnectPooledPostgresqlDatabase来获取数据库连接

测试

  1. 启动程序 -->重起数据库服务–>读写数据库操作正常
  2. 启动应用程序–>关闭数据库服务–>读写数据库失败–>启动数据库服务–>读写数据库操作正常

示例:

from playhouse.pool import PooledPostgresqlDatabase
from peewee import OperationalError, InterfaceError
from playhouse.shortcuts import ReconnectMixin


class ReconnectPooledPostgresqlDatabase(ReconnectMixin, PooledPostgresqlDatabase):
    """
    支持重连机制的数据库连接池类,可以通过扩展reconnect_errors来支持重连场景
    """
    reconnect_errors = (
        # Postgres error examples:
        (OperationalError, 'terminat'),
        (InterfaceError, 'connection already closed')
    )


class PostgresqlManager(object):
    """
    PG数据库管理类
    """
    __instance_lock = threading.Lock()
    __database = None

    @classmethod
    def get_database(cls, **kwargs):
        if cls.__database is None:
            with cls.__instance_lock:
                cls.__database = PooledPostgresqlDatabase(
                    database=kwargs.get("database"),
                    host=kwargs.get("host", "127.0.0.1"),
                    port=int(kwargs.get("port", 5432)),
                    user=kwargs.get("user", "postgres"),
                    password=kwargs.get("password", "postgres"),
                    max_connections=int(kwargs.get("max_connections", 50)),
                    stale_timeout=int(kwargs.get("stale_timeout", 600))
                )
        return cls.__database

http://www.kler.cn/a/301524.html

相关文章:

  • 编写一个生成凯撒密码的程序
  • MongoDB在现代Web开发中的应用
  • SpringBoot实现WebSocket
  • 云原生之运维监控实践-使用Telegraf、Prometheus与Grafana实现对InfluxDB服务的监测
  • web——upload-labs——第三关——后缀黑名单绕过
  • [前端面试]javascript
  • 掌握 Linux 命令的艺术:深入解析与实用指南
  • 7. MyBatis中的SqlSession是什么?如何管理SqlSession的生命周期?
  • uniapp写移动端常见问题汇总
  • 反序列化漏洞练习2
  • python 实现判断IP4地址是否有效算法
  • MongoDB延迟查询
  • chapter14-集合——(List-Map)——day18
  • ctfshow-文件包含
  • JavaEE:多线程进阶(线程安全的集合类)
  • Python实现Paillier同态加密算法
  • JavaWeb开发中为什么Controller里面的方法是@RequestMapping?
  • 张力控制器的原理
  • 【2023年】云计算金砖牛刀小试3
  • 《C++枚举类型的进化:从传统到现代的飞跃》
  • SAP B1 学习笔记 - 易混淆字段名(持续更新中)
  • 【c/c++】类型转换:隐式类型转换、强制类型转换
  • Vue - 关于Router路由跳转时显示的animate.css动画
  • ffmpeg使用安装使用教程(命令行-Python)
  • 后端Web之SpringBoot原理
  • Ubuntu 22.04 系统中 ROS2安装