2013-08-07 84 views
4

我知道這個問題已被問了幾次,但我仍然不確定使用線程的scoped_session。基本上,我有一個應用程序與10個工作線程。我有一個連接池大小爲11的Engine。每個線程都有它自己的會話,並且不需要在線程的會話中共享信息(如果可以,那很好,但我已經創建了一個解決方法)。最後,我在複雜SQL語句的主線程中使用SQLAlchemy Core,這就是爲什麼我在連接池中有11個線程。線程和SQLAlchemy會話

我使用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)[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

回答