Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Obsługa restartu mysql w SQLAlchemy

2021 Uwaga: Oryginalna odpowiedź pochodzi z 2010 roku. Teraz lepszym podejściem, jak wskazano w komentarzach, wydaje się być używanie parametr pool_recycle .

Następuje oryginalna odpowiedź z 2010 roku.

Zobacz EDIT na dole, aby zobaczyć testowane rozwiązanie

Nie próbowałem, ale może używając Odbiornik basenu jest droga?

Możesz zrobić coś takiego:

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

W ten sposób za każdym razem, gdy połączenie ma zostać pobrane z puli, sprawdzamy, czy rzeczywiście jest połączone z serwerem. Jeśli nie, dajemy sqlalchemy jedną szansę na ponowne połączenie. Następnie, jeśli problem nadal występuje, odpuszczamy.

PS:Nie testowałem, czy to działa.

Edycja:Jeśli chodzi o Pylony, modyfikacje inicjalizacji silnika pokazane powyżej musiałyby być wykonane w your_app.model.init_model (Pylons 0.9.7) lub your_app.config.environment.load_environment (Pylony 1.0) funkcja - to są to są miejsca miejsce, w którym tworzona jest instancja silnika.

EDYTUJ

Ok. Udało mi się odtworzyć opisaną sytuację. Powyższy kod wymaga pewnych zmian, aby działał. Poniżej znajduje się, jak należy to zrobić. Nie ma również znaczenia, czy jest to 0.9.7 czy 1.0.

Musisz edytować your_app/config/environment.py. Umieść te eksporty na górze pliku:

import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions

A koniec funkcji load_environment powinien wyglądać tak:

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)

Tym razem udało mi się to przetestować (na Pylons 1.0 + SQLAlchemy 0.6.1) i działa. :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Skrypt PHP do wypełniania tabel MySQL

  2. Jak usunąć hasło roota MySQL?

  3. SQLSTATE[22007]:Nieprawidłowy format daty i godziny:1292 Niepoprawna wartość daty i godziny:„2008-03-30 02:56:12”

  4. Zapytanie MySQL - uzyskiwanie brakujących rekordów podczas korzystania z grupowania

  5. 1. rząd w grupie według ostatniego rzędu