你好!请帮助设计应用程序。我正在用 Python3(使用线程)编写一个多线程应用程序。作为 ORM,我使用 SQLAlchemy。在此应用程序中,多个线程连接到数据库。连接数据库是通过单例实现的。这个实现中的独行者是一个修饰如下的类:
def singleton(cls):
instance = {}
def get_instance():
if cls not in instance:
instance[cls] = cls()
return instance[cls]
return get_instance()
@singleton
class Connector:
def __init__(self):
db = "параметры подключения"
self.engine = create_engine(db)
Session = sessionmaker(bind=self.engine)
self.session = Session()
def get_connection(self): # вызывается когда нужен доступ к базе
return self.session
请告诉我,这个实现中会出现什么问题?在不同的线程中尝试使用Connect类的方法会不会发生阻塞?(理论上,对类的实例施加锁定应该会产生 GIL)。目前,我定期在线程工作中遇到错误:
sqlalchemy.exc.ResourceClosedError:此连接已关闭
也许像这样的实现会更好:
应用:
我在码头的指导下,似乎解决方案取决于所选的 DBMS,但总的来说这个话题很有趣,很高兴看到有经验的参与者的富有成效的例子。
您不能使用来自不同线程的相同会话。每个线程都有自己的会话。这在这里得到了非常详细的回答。这是另一个非常有启发性的文档(除了那个答案中的文档)——会话线程安全吗?
您的单例似乎解决了与
ScopedSession
.从方法的名称来看
get_connection
,我们似乎在谈论连接到数据库。SQLAlchemy 会话与简单连接不同。忽略这些概念之间的差异会导致可悲的后果。例如,未关闭的会话可能会导致数据丢失。