2021 Obs: Det ursprungliga svaret är från 2010. Nu verkar det bättre tillvägagångssättet, som påpekats i kommentarerna, vara att använda pool_recycle param .
Ursprungligt svar från 2010 följer.
Se EDIT längst ned för testad lösning
Jag försökte inte det, men jag kanske använder PoolListener är en väg att gå?
Du kan göra något så här:
class MyListener(sqlalchemy.interfaces.PoolListener):
def __init__(self):
self.retried = False
def checkout(self, dbapi_con, con_record, con_proxy):
try:
dbapi_con.info() # is there any better way to simply check if connection to mysql is alive?
except sqlalchemy.exc.OperationalError:
if self.retried:
self.retried = False
raise # we do nothing
self.retried = True
raise sqlalchemy.exc.DisconnectionError
# next, code according to documentation linked above follows
e = create_engine("url://", listeners=[MyListener()])
På så sätt testar vi varje gång anslutningen är på väg att checkas ut från poolen om den verkligen är ansluten till servern. Om inte, ger vi sqlalchemy en chans att återansluta. Efter det, om problemet kvarstår, släpper vi det.
PS:Jag testade inte om det här fungerar.
Redigera:När det gäller Pylons, skulle modifieringar av motorinitieringen som visas ovan behöva göras i your_app.model.init_model (Pylons 0.9.7) eller your_app.config.environment.load_environment (Pylons 1.0) function - dessa är det här är platserna plats där motorinstansen skapas.
REDIGERA
Ok. Jag kunde återge beskriven situation. Koden ovan behöver några ändringar för att fungera. Nedan är hur det ska göras. Det spelar heller ingen roll om det är 0.9.7 eller 1.0.
Du måste redigera your_app/config/environment.py. Placera dessa exporter överst i filen:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
Och slutet av load_environment-funktionen bör se ut så här:
class MyListener(sqlalchemy.interfaces.PoolListener):
def __init__(self):
self.retried = False
def checkout(self, dbapi_con, con_record, con_proxy):
try:
dbapi_con.cursor().execute('select now()')
except _mysql_exceptions.OperationalError:
if self.retried:
self.retried = False
raise
self.retried = True
raise sqlalchemy.exc.DisconnectionError
config['sqlalchemy.listeners'] = [MyListener()]
engine = engine_from_config(config, 'sqlalchemy.')
init_model(engine)
Den här gången kunde jag testa det (på Pylons 1.0 + SQLAlchemy 0.6.1) och det fungerar. :)