4

この質問が何度か聞かれたことは知っていますが、scoped_sessionwith threading の使用法についてはまだ確信が持てません。基本的に、10 個のワーカー スレッドを持つアプリケーションがあります。接続プール サイズが 11 のものEngineがあります。各スレッドには独自のセッションがあり、スレッドのセッション間で情報を共有する必要はありません (可能であればそれは素晴らしいことですが、回避策を作成しました)。最後に、複雑な SQL ステートメントのメイン スレッドで SQLAlchemy Core を使用しています。これが、接続プールに 11 のスレッドを持っている理由です。

MySQL を使用しており、pool_recycle3600 に設定されています。エラーが発生し続けます。

(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()、このセッション全体を呼び出して使用します。

4

1 に答える 1

0

ドキュメントによると、サブプロセスごとにエンジンの異なるインスタンスを使用する必要があります。サブプロセス間の接続プールを共有できないため、すべてのサブプロセスに1つのエンジンを使用する必要があります(私が理解しているように)。

http://docs.sqlalchemy.org/en/rel_0_8/core/connections.html

于 2013-11-17T21:47:06.583 に答える