数据库连接池SQLAlchemy中多线程安全的问题
2018-03-08 16:29
417 查看
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): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(20)) fullname = Column(String(20)) password = Column(String(20)) age = Column(Integer) class MyThread(threading.Thread): def __init__(self, threadName): super(MyThread, self).__init__() self.name = threading.current_thread().name def run(self): session = Session() #每个线程都可以直接使用数据库模块定义的Session session.query(User).all() user = User(name="hawk-%s"%self.name, fullname="xxxx",password="xxxx",age=10) session.add(user) time.sleep(1) if self.name == "thread-9": session.commit() Session.remove() if __name__ == "__main__": arr = [] for i in xrange(10): arr.append(MyThread('thread-%s' % i)) for i in arr: i.start() for i in arr: i.join()
错误示范:
class MyThread(threading.Thread): def __init__(self, threadName): super(MyThread, self).__init__() self.session = Session() #错误! self.name = threading.current_thread().name def run(self): self.session.query(User).all() user = User(name="hawk-%s"%self.name, fullname="xxxx",password="xxxx",age=10) self.session.add(user) time.sleep(1) if self.name == "thread-9": self.session.commit() Session.remove()
错误解析:
看了SQLAlchemy之后源码发现,Session() 返回的是一个threading.local()对象的成员变量,threading.local()对象只有在线程内部才能实现线程隔离,因此只能放在run()函数里,而不能作为类成员变量。如果按照错误示例来运行,所有线程其实公用了一个session,没有做到线程隔离,session.commit()操作会互相影响,我们原本只想将thread-9中的数据插入,结果会发现,所有线程中的数据全部被插入。
参考:
https://www.cnblogs.com/1a2a/p/8278698.htmlhttp://blog.csdn.net/kikaylee/article/details/53232920
相关文章推荐
- 多线程的安全问题
- Java——多线程安全问题
- JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决
- 为什么多线程会产生线程不安全问题?
- 多线程学习2,买火车票,并解决同步安全的问题
- 【我的Java笔记】多线程安全问题 & 同步机制
- java中面对多线程安全问题,用什么样的Map
- Servlet多线程安全问题
- 多线程的安全问题
- Servlet多线程安全问题
- 黑马程序员_多线程之同步问题的前期,以及安全问题的发现和解决
- 关于CoreData和SQLite多线程访问时的线程安全问题
- Java基础-多线程-②多线程安全问题
- Servlet多线程安全问题
- java多线程安全问题的解决
- 多线程安全问题的解决方法一
- 黑马程序员-多线程(线程的安全问题与锁的理解)
- java多线程-多线程的安全问题-多线程同步代码块-锁Synchronized
- 黑马程序员-学习日记(多线程安全问题和死锁认识)
- 多线程解决安全问题的方法(Synchronized)