python 多进程共享数据库连接池_tornado多进程+sqlalchemy连接池

问题:

tornado多进程+sqlalchemy连接池,经常报错:mysql server has gone away

原因分析:

父进程创建了子进程之后,子进程会使用调用父进程的mysql连接;当这个子进程退出时,连接被关闭;当父进程再创建子进程时,这个子进程同样调用了父进程的mysql连接,而此时mysql连接已经被上一个进程关闭,但当前子进程并不知道这一点,所以就会报错。

解决:SQLAlchemy 1.3 Documentation​docs.sqlalchemy.org

from sqlalchemy import event

from sqlalchemy import exc

import os

engine = create_engine("...")

#多进程相关配置,Pool使用事件来检测自身,以便在子进程中自动使连接无效

@event.listens_for(engine, "connect")

def connect(dbapi_connection, connection_record):

connection_record.info['pid'] = os.getpid()

@event.listens_for(engine, "checkout")

def checkout(dbapi_connection, connection_record, connection_proxy):

pid = os.getpid()

if connection_record.info['pid'] != pid:

connection_record.connection = connection_proxy.connection = None

raise exc.DisconnectionError(

"Connection record belongs to pid %s, "

"attempting to check out in pid %s" %

(connection_record.info['pid'], pid)

)

抱歉,我之前理解错了你的问题,__TimerPool并不是JDBC连接池,而是Payara Server中用于管理定时任务的线程池。而JDBC连接池是Payara Server中的另一个重要组件,用于管理和维护应用程序与数据库之间的连接。下面是关于JDBC连接池的一些信息: JDBC连接池是Payara Server中的一个重要组件,它可以帮助应用程序管理和维护与数据库之间的连接,提高应用程序的性能和可靠性。JDBC连接池可以缓存数据库连接,避免每次请求都建立新的连接,从而减少连接建立和断销。 在Payara Server中,JDBC连接池连接池管理器进行管理,连接池管理器可以根据应用程序的需求自动创建和回收连接。连接池管理器还可以配置连接池的大小、最大连接数、最小连接数等参数,以满足应用程序的需求。 JDBC连接池在Payara Server中的作用如下: 1. 提高性能:JDBC连接池可以缓存数据库连接,避免每次请求都建立新的连接,从而减少连接建立和断销,提高应用程序的性能。 2. 提高可靠性:JDBC连接池可以自动检测和回收失效的连接,避免应用程序因为连接失效而出现异常。 3. 管理连接:JDBC连接池可以管理和维护连接,确保连接池中的连接始终处于可用状态。 总之,JDBC连接池是Payara Server中的一个重要组件,它可以帮助应用程序管理和维护与数据库之间的连接,提高应用程序的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值