sql >> Databáze >  >> RDS >> Mysql

Zvládněte restart mysql v SQLAlchemy

Poznámka 2021: Původní odpověď je z roku 2010. Nyní se zdá, že lepším přístupem, jak bylo zdůrazněno v komentářích, je použití pool_recycle param .

Následuje původní odpověď z roku 2010.

Otestované řešení naleznete v části UPRAVIT v dolní části

Nezkoušel jsem to, ale možná pomocí PoolListener je cesta?

Můžete udělat něco takového:

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

Tímto způsobem pokaždé, když se má připojení odhlásit z fondu, testujeme, zda je skutečně připojeno k serveru. Pokud ne, dáme sqlalchemy jednu šanci znovu se připojit. Poté, pokud problém přetrvává, necháme to být.

PS:Netestoval jsem, jestli to funguje.

Edit:Pokud jde o Pylony, úpravy inicializace motoru zobrazené výše by bylo nutné provést v your_app.model.init_model (Pylons 0.9.7) nebo your_app.config.environment.load_environment (Pylons 1.0) funkce - toto jsou toto jsou místa místo, kde se vytvoří instance motoru.

UPRAVIT

Dobře. Podařilo se mi reprodukovat popsanou situaci. Výše uvedený kód potřebuje nějaké změny, aby fungoval. Níže je uvedeno, jak by to mělo být provedeno. Také nezáleží na tom, zda je to 0.9.7 nebo 1.0.

Musíte upravit your_app/config/environment.py. Umístěte tyto exporty na začátek souboru:

import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions

A konec funkce load_environment by měl vypadat takto:

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)

Tentokrát jsem to mohl otestovat (na Pylons 1.0 + SQLAlchemy 0.6.1) a funguje to. :)



  1. SQLAlchemy func.count na booleovském sloupci

  2. Získejte chybějící data z databáze přes MySQL

  3. Rozdělení řetězce do více řádků v Oracle

  4. (Čeština) Jak používat Oracle Database 19c Pre-Built Developer VM