我知道这个问题已经被问过几次了,但我仍然不确定scoped_session
with threading 的用法。基本上,我有一个有 10 个工作线程的应用程序。我有一个Engine
连接池大小为 11。每个线程都有自己的会话,并且不需要在线程的会话之间共享任何信息(如果可以的话,那会很好,但我已经创建了一个解决方法)。最后,我在主线程中使用 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()
每个工作人员自始至终都调用并使用此会话。