2013-08-07 16 views
4

이 질문에 몇 번 질문했지만 나는 스레딩을 사용하여 scoped_session의 사용법에 대해 여전히 확신 할 수 없다는 것을 알고 있습니다. 기본적으로 10 개의 작업자 스레드가있는 응용 프로그램이 있습니다. 하나의 Engine은 연결 풀 크기가 11입니다. 각 스레드는 고유 한 세션을 가지고 있으며 스레드의 세션간에 정보를 공유 할 필요가 없습니다 (가능하다면 해결할 수 있지만 해결 방법을 만들었습니다). 마지막으로 복잡한 SQL 문에 대해 SQLAlchemy Core를 주 스레드에서 사용하고 있습니다. 따라서 연결 풀에 11 개의 스레드가 있습니다. 내가 MySQL과를 사용하고스레딩 및 SQLAlchemy 세션

pool_recycle가 나는 점점 오류가 계속 3600로 설정 : 심지어 어떤 pool_recycle 설정하지 않고, 하나 개의 작업자 스레드를했을 때 일어난 적이없는이

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

. 나는 MySQL과 SQLAlchemy에 대해 아주 기본적인 지식을 가지고 있기 때문에, SQLAlchemy 나 MySQL을 사용했을 때의 문제 (또는 위의 것 중 어느 것도 해당하지 않음)가 확실하지는 않습니다.

common = Common() 
class Common(object): 
    def __init__(self): 
    ... 
     self.engine = create_engine(
      '%(type)s://%(username)s:%(password)[email protected]%(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()를 호출을 통해이 세션을 사용

여기 내 설정입니다.

+0

[쿼리 동안 MySQL 서버에 연결이 끊어]의 가능한 중복 (http://stackoverflow.com/questions/1884859/lost-connection-to-mysql-server-during-query) – SingleNegationElimination

+0

어디 있어요 여기에'scoped_session'이 사용 되었습니까? 아마도'self.session = scoped_session (sessionmaker (bind = self.engine))'을 시도한 후 다음을 수행하십시오 :'self.session(); self.session.query ....; self.session.remove()' – jaor

답변

0

설명서에 따르면 모든 하위 프로세스에 대해 엔진의 다른 인스턴스를 사용해야합니다. 하위 프로세스 간의 연결 풀을 공유 할 수 없기 때문에 모든 하위 프로세스에 대해 하나의 엔진을 사용할 수 있습니다.

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

관련 문제