问题描述
写了一个
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

最低0.47元/天 解锁文章
1029

被折叠的 条评论
为什么被折叠?



