【Python SQLAlchemy】数据库连接池SQLAlchemy中多线程安全的问题

问题描述

写了一个apscheduler定时任务
里面用到SQLAlchemy在同一时间点开启了18个任务,用于更新18个表
但是最终看数据库表的时候,发现有2个表未更新。查看打印日志均正常,查找原因。


参考以下
提问

最近把原来的单线程改为多线程,从而引起了sqlalchemy的错误。

我自己简单封装了 一个sqlalchemy类,用来进行各种数据库操作。

自从改为多线程后,线程一多,在更新数据的时候就会出错。
我自己封装的sqlalchemy,是共用一个 Session的

def __init__():
Session = sessionmaker(bind=self.engine)
self.session = Session()

请教:如果我们想继续使用多线程,应该怎么改进我自己的封装的 sqlalchemy类,

是做数据库连接池,还是可以多建几个 session , 一个engine可以同时建立几个 session??
回答

我也遇到了同样的问题,产生问题的原因是session并不是线程安全,当你在一个线程commit时,所有线程都会commit(好像是这样,不是100%确定),文档推荐使用scoped_session


数据库连接池SQLAlchemy中多线程安全的问题
正确示范:
1、数据库模块model.py
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
session_factory = sessionmaker(bind=some_engine)
Session = scoped_session(session_factory)
2、业务模块thread.py
import threading
from model import Session

class User(Base):
    __tab
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值