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
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值