sql >> Databasteknik >  >> RDS >> Mysql

Hantera mysql-omstart i SQLAlchemy

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. :)



  1. Hur du kontrollerar din sessions ANSI_NULLS-inställning i SQL Server

  2. SQL Server 2012 kolumnidentitetsökning hoppar från 6 till 1000+ på 7:e posten

  3. Microsoft tillkännager SQL Server 2012 R2 och SQL Server 2012 R3!

  4. FNDCPASS &AFPASSWD