线程和SQLAlchemy会话

4
我知道这个问题已经被问了几次,但是我仍然不确定在使用scoped_session和线程时的用法。基本上,我的应用程序有10个工作线程。我有一个连接池大小为11的Engine。每个线程都有它自己的会话,并且不需要在线程之间共享任何信息(如果可以的话,那就很好,但我已经创建了一个解决方法)。最后,在主线程中使用SQLAlchemy Core进行复杂的SQL语句,这就是为什么我在连接池中有11个线程的原因。

我正在使用MySQL,我的pool_recycle设置为3600。我一直在收到错误:

(OperationalError) (2013, 'Lost connection to MySQL server during query')

即使没有设置任何pool_recycle,当我只有一个工作线程时,这从未发生过。我对MySQL和SQLAlchemy有一个非常基本的理解,所以我不确定我的问题是否起源于我对SQLAlchemy或MySQL的使用(或两者都不是)。

这是我的设置:

common = Common()
class Common(object):
    def __init__(self):
    ...
         self.engine = create_engine(
            '%(type)s://%(username)s:%(password)s@%(endpoint)s:%(port)s/%(name)s?charset=utf8' % {
              'type': config.get('db_type'),
              'username': 'foo',
              'password': 'bar',
              'endpoint': config.get('db_endpoint'),
              'port': str(config.get('db_port')),
              'name': config.get('db_name'),
            },
        encoding='utf-8',
        pool_size=config.get('num_workers') + 1,
        pool_recycle=3600,
    )
    self.session = sessionmaker(bind=self.engine)

每个工作者都会调用 self.session = common.session() 并在整个过程中使用此会话。

可能是查询时失去了与MySQL服务器的连接的重复问题。 - SingleNegationElimination
这里使用了 scoped_session 吗?也许可以尝试:self.session = scoped_session(sessionmaker(bind=self.engine)),然后执行:self.session(); self.session.query....; self.session.remove() - jaor
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接