Używam Flask-SQLAlchemy 1.0, Flask 0.10, SQLAlchemy 0.8.2 i Python 2.7.5. Łączę się z MySQL 5.6 za pomocą Oracle MySQL Connector/Python 1.0.12.OperationalError: połączenie MySQL nie jest dostępne
Po ponownym uruchomieniu serwera WWW (albo wbudowany Apache2 lub Flask) otrzymuję wyjątek OperationalError: MySQL Connection not available
po wygaśnięciu wait_timeout
MySQL (domyślnie 8 godzin).
Znalazłem osoby z numerem similar problems i jawnie ustawiono SQLALCHEMY_POOL_RECYCLE = 7200
, mimo że jest to Flask-SQLAlchemy's default. Po umieszczeniu punktu przerwania here widzę, że funkcja rozłączania pomyślnie wywołuje session.remove()
po każdym żądaniu. Jakieś pomysły?
Aktualizacja 21.07.2014:
Ponieważ kwestia ta nadal otrzymuje uwagę, muszę dodać, że niewypróbować niektóre z propozycji. Dwóch moich prób wyglądało następujący:
First:
@contextmanager
def safe_commit():
try:
yield
db.session.commit()
except:
db.session.rollback()
raise
To pozwoliło mi owinąć popełniają połączenia tak:
with safe_commit():
model = Model(prop=value)
db.session.add(model)
Jestem w 99% pewien, że to zrobiłem nie przegap żadnych połączeń db.session.commit
za pomocą tej metody i nadal miałem problemy.
drugie:
def managed_session():
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
try:
response = f(*args, **kwargs)
db.session.commit()
return response
except:
db.session.rollback()
raise
finally:
db.session.close()
return decorated_function
return decorator
Aby zapewnić, że nie brakowało każdy popełnić połączeń, zrobiłem kolby owijkę, która umożliwiła kod taki jak (jeśli dobrze pamiętam):
@managed_session()
def hello(self):
model = Model(prop=value)
db.session.add(model)
return render_template(...
Niestety, żadna z metod nie zadziałała. Przypominam też, że próbuję wywołać wywołania SELECT (1), próbując ponownie nawiązać połączenie, ale nie mam już tego kodu.
Dla mnie podstawą jest MySQL/SQL Alchemy ma problemy. Po migracji do Postgres nie musiałem się martwić o moje zatwierdzenia. Wszystko po prostu działało.
Skończyłem grać z kwotą recyklingu, aż przestało się dziać. Będę musiał sprawdzić dokładną kwotę, ale uważam, że było to około 3200. – AlexLordThorsen
Powinieneś również sprawdzić swoją aktualną konfigurację MySQL, możesz zapytać, aby uzyskać aktualny czas recyklingu. Miałem również ten problem i naprawiłem go, ustawiając limit czasu na 3600, jeśli to ci pomaga. Podjęcie rzeczywistej skonfigurowanej wartości wciąż stwarzało problemy, więc wziąłem połowę z tego i od tego czasu nie mam żadnych problemów. – javex
@javax: Zmieniłeś 'wait_timeout' lub SqlAlchemy's pool_recycle MySQL? Tak czy inaczej, po prostu dostosowałem pool_recycle do 3600. Sprawdzę, co stanie się jutro rano. – Pakman