sql >> Database >  >> RDS >> Mysql

Verwerk mysql-herstart in SQLAlchemy

2021 Opmerking: Het oorspronkelijke antwoord is van 2010. Nu lijkt de betere aanpak, zoals aangegeven in de opmerkingen, het gebruik van het gebruik van pool_recycle parameter .

Origineel antwoord uit 2010 volgt.

Zie BEWERKEN onderaan voor geteste oplossing

Ik heb het niet geprobeerd, maar misschien met behulp van PoolListener is een manier om te gaan?

Je zou zoiets als dit kunnen doen:

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()])

Op deze manier testen we elke keer dat de verbinding wordt uitgecheckt uit de pool, of deze daadwerkelijk is verbonden met de server. Zo niet, dan geven we sqlalchemy één kans om opnieuw verbinding te maken. Daarna, als het probleem er nog steeds is, laten we het los.

PS:ik heb niet getest of dit werkt.

Bewerken:wat betreft de pylonen, wijzigingen aan de hierboven getoonde engine-initialisatie moeten worden gedaan in your_app.model.init_model (Pylons 0.9.7) of your_app.config.environment.load_environment (Pylonen 1.0) functie - dit zijn dit zijn de plaatsen plaats waar de engine-instantie wordt gemaakt.

BEWERKEN

Ok. Ik kon de beschreven situatie reproduceren. De bovenstaande code heeft enkele wijzigingen nodig om te kunnen werken. Hieronder staat hoe het moet. Het maakt ook niet uit of het 0.9.7 of 1.0 is.

U moet uw_app/config/environment.py bewerken. Zet deze exports bovenaan het bestand:

import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions

En het einde van de functie load_environment zou er zo uit moeten zien:

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)

Deze keer kon ik het testen (op Pylons 1.0 + SQLAlchemy 0.6.1) en het werkt. :)



  1. GWFG in Oracle RAC

  2. OpenSSL - fout 18 bij 0 diepte opzoeken:zelfondertekend certificaat

  3. Hoe PHP-code periodiek op een automatische manier uit te voeren?

  4. MariaDB JSON_QUERY() uitgelegd