この質問が何度か聞かれたことは知っていますが、scoped_session
with threading の使用法についてはまだ確信が持てません。基本的に、10 個のワーカー スレッドを持つアプリケーションがあります。接続プール サイズが 11 のものEngine
があります。各スレッドには独自のセッションがあり、スレッドのセッション間で情報を共有する必要はありません (可能であればそれは素晴らしいことですが、回避策を作成しました)。最後に、複雑な SQL ステートメントのメイン スレッドで SQLAlchemy Core を使用しています。これが、接続プールに 11 のスレッドを持っている理由です。
MySQL を使用しており、pool_recycle
3600 に設定されています。エラーが発生し続けます。
(OperationalError) (2013, 'Lost connection to MySQL server during query')
これは、セットがなくても、ワーカー スレッドが 1 つしかない場合には発生しませんでした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()
、このセッション全体を呼び出して使用します。