2012-01-11 18 views
16

MySQL ile SQLAlchemy kullanarak bir Flask web uygulaması var ve bir scopedsession() kurdum. Ayrıca her istek bittikten sonra session.remove() öğesini çağıran bir teardown_request işleyicisi de var. Bazı garip bir nedenle, bir gün veya daha fazla bir süre için web uygulamasında herhangi bir istek yapılmazsa, uygulama "Operationalerror: MySQL Server gitti" olur. Benim ayıklama misyon olarak SQLAlchemy MySQL bağlantımın her zaman uykuya dalması garip mi?

, ben GÖSTER processlist bakıp şu gördüğümüz:

39817253 | sqladmin | my_host | kb_dev | Sleep | 174 | 

174 saniye sayısı "uyku" olmuştur benim uygulamadan bağlantıdır. Uygulama başka bir istekte bulunmazsa saymaya devam eder.

Uygulamam, isteğim bittikten sonra bile MySQL bağlantısına dayanıyor gibi görünüyor! Uygulamamla eşzamanlı olarak veya istemediğim kaç tane talep olursa olsun genellikle tek bir süreç var.

Sorum, bağlantının bu kadar uzun süre "uyku" olması normal midir? Uzatılmış uykunun, MySQL'in "OperationError: Mysql gitti" hatasına neden olan belirli bir zaman aşımı sonrasında bağlantıyı kesmesine neden olduğundan eminim.

+0

Sorunu çözdünüz mü? Pool_recycle ayarı benim için çalışmıyor. –

cevap

23

sqlalchemy varsayılan davranışı Engine içinde havuz bağlantıları şudur:

http://www.sqlalchemy.org/docs/core/engines.html

http://www.sqlalchemy.org/docs/core/pooling.html

Bildiğim kadarıyla bağlantı kesme gecede şey olarak, bu bilinen bir MySQL davranış, SQLAlchemy için pool_recycle bayrağı sağlar

etrafında çalışmak. İşte tarif birçok bağlantılar şunlardır:

http://www.sqlalchemy.org/docs/dialects/mysql.html#connection-timeouts

http://www.sqlalchemy.org/docs/core/pooling.html#setting-pool-recycle

http://www.sqlalchemy.org/docs/core/engines.html#sqlalchemy.create_engine (pool_recycle) sadece birkaç gün önce gelen

http://www.sqlalchemy.org/trac/wiki/FAQ#MySQLserverhasgoneaway

blog gönderisi:

http://douglatornell.ca/blog/2012/01/08/staying-alive/

+0

Teşekkürler zzzeek, ​​her şey şimdi mantıklı. Bağlantı havuzlamanın varsayılan olarak etkinleştirildiğini bilmiyordum. Ama şimdi pool_recycle seçeneğini deneyeceğim gibi görünüyor. – trinth

+0

@ trinth probleminizi çözebildiniz mi? Ben aynı durumdayım. – giga

+0

@giga bir süre oldu ama sanırım pool_recycle seçeneği benim için – trinth