1、基于threding.local,推荐使用
from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session from models import Student from threading import Thread engine = create_engine( "mysql+pymysql://root:密码@127.0.0.1:3306/数据库?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) SessionFactory = sessionmaker(bind=engine) session = scoped_session(SessionFactory) def task(): ret = session.query(Student).all() # 将连接交还给连接池 session.remove() for i in range(20): t = Thread(target=task) t.start()
2、基于多线程
from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from models import Student from threading import Thread engine = create_engine( "mysql+pymysql://root:密码@127.0.0.1:3306/数据库?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) SessionFactory = sessionmaker(bind=engine) def task(): # 去连接池中获取一个连接 session = SessionFactory() ret = session.query(Student).all() # 将连接交还给连接池 session.close() for i in range(20): t = Thread(target=task) t.start()
本文介绍如何使用SQLAlchemy结合多线程进行数据库操作,包括基于threading.local的scoped_session使用方法和直接在多线程中使用sessionmaker获取session的两种方式,对比了它们在连接管理和资源回收上的不同。
353

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



