Mysql
 sql >> база данни >  >> RDS >> Mysql

Обработвайте рестартирането на mysql в SQLAlchemy

Забележка за 2021 г.: Първоначалният отговор е от 2010 г. Сега по-добрият подход, както е посочено в коментарите, изглежда е използването pool_recycle param .

Следва оригинален отговор от 2010 г.

Вижте РЕДАКТИРАНЕ в долната част за тествано решение

Не го пробвах, но може би използвах PoolListener начин ли е?

Можете да направите нещо подобно:

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

По този начин всеки път, когато връзката е на път да бъде изтеглена от пула, ние тестваме дали действително е свързана със сървъра. Ако не, даваме на sqlalchemy един шанс да се свърже отново. След това, ако проблемът все още е налице, ние го пускаме.

PS:Не съм тествал дали това работи.

Редактиране:Що се отнася до Pylons, модификациите на показаната по-горе инициализация на двигателя ще трябва да бъдат направени в your_app.model.init_model (Pylons 0.9.7) или your_app.config.environment.load_environment (Pylons 1.0) функция - това са това са места място, където се създава екземпляр на двигателя.

РЕДАКТИРАНЕ

Добре. Успях да възпроизведа описаната ситуация. Кодът по-горе се нуждае от някои промени, за да работи. По-долу е как трябва да се направи. Също така няма значение дали е 0.9.7 или 1.0.

Трябва да редактирате your_app/config/environment.py. Поставете тези експортирания в горната част на файла:

import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions

И краят на функцията load_environment трябва да изглежда така:

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)

Този път успях да го тествам (на Pylons 1.0 + SQLAlchemy 0.6.1) иработи. :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да направя ПЪЛНО ВЪНШНО ПРИСЪЕДИНЕНИЕ в MySQL?

  2. Необходим ли е SET CHARACTER SET utf8?

  3. CONCAT множество полета към едно поле с единично разстояние

  4. Как да кодирате апостроф, така че да може да се търси в mysql?

  5. PHP и SQL хеширане Помощ:Какво правя нередно?