Normalerweise verwende ich SQLAlchemy, wenn ich MySQL von Python aus treffe. Ich bin bei der Entwicklung in Local nicht besonders belästigt, aber nach der Bereitstellung mit uwsgi in einer Umgebung in der Nähe der Produktion trat häufig das Phänomen auf, dass das System aufgrund eines mysteriösen Fehlers abstürzte.
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')
Und
_mysql_exceptions.OperationalError: (2013, 'Lost connection to MySQL server during query')
Und
sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back
Und dieser Fehler ...
SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request
Nach der Untersuchung sind viele Menschen auf dieses Problem gestoßen und haben verschiedene Lösungen erhalten. Da es jedoch je nach Blog unterschiedlich ist, habe ich es von Anfang an versucht.
Ich werde ein Memorandum darüber hinterlassen, was funktioniert hat, aber da es ein Rätsel um die Wahrheit ist, würde ich es begrüßen, wenn Sie mir sagen könnten, ob es falsch erscheint.
Beginnen Sie als Voraussetzung an der Stelle, an der die Engine und die Sitzung wie folgt erstellt wurden.
from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import scoped_session, sessionmaker
metadata = MetaData()
engine = create_engine(uri, encoding='utf-8', pool_recycle=3600)
session = scoped_session(sessionmaker(autocommit=False,
expire_on_commit = False,
autoflush=True,
bind=_engine))
metadata.create_all(bind=engine)
[Referenz] Python: Lösen Sie das Problem, dass mein MySQL-Server in SQLAlchemy verschwunden ist.
Laut Referenzseite ist dieser Fehler
Tritt auf, wenn SQLAlchemy eine SQL-Anweisung ausgibt, während die Verbindung zu MySQL abgelaufen ist
Überprüfen Sie also zuerst das wait_timeout auf der MySQL-Seite und geben Sie einen kleineren Wert in pool_recycle
an.
Überprüfen Sie die Einstellung wait_timeout auf der SQL-Seite und überprüfen Sie sie
> show global variables like 'wait_timeout';
+--------------------------+----------+
| Variable_name | Value |
+--------------------------+----------+
| innodb_lock_wait_timeout | 50 |
| lock_wait_timeout | 31536000 |
| wait_timeout | 600 |
+--------------------------+----------+
3 rows in set (0.00 sec)
Es wurde kleiner als die angegebene Zeit von pool_recycle
gemacht (diesmal 60 für den Test). Ich hatte das Gefühl, dass die Anzahl der Fehler etwas abgenommen hatte, aber das Problem blieb bestehen und ich suchte nach einer anderen Methode.
[Referenz] [Python] Kampf gegen SQL-Alchemie
Laut der Referenzseite ist es wichtig, das Auslassen des Sitzungsabschlusses zu vermeiden
@app.teardown_appcontext
def session_clear(exception):
if exception and session.is_active:
session.rollback()
else:
session.commit()
session.close()
Flask '@ app.teardown_appcontext' wird jedes Mal am Ende der Anfrage aufgerufen, daher schließen Sie die Sitzung hier explizit. Die meisten Fehler sind bisher verschwunden, aber manchmal verschwindet SQL.
SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request
Verschwindet nicht egal was. .. ..
[Referenz] MySQL-Server wurde mit Flask und SQL Alchemy entfernt
Dies ist der letzte Weg dorthin. Wenn die Verbindung geschlossen ist, starten Sie den Vorgang zuerst im Voraus. Ist es die Methode? Vorerst wurden alle Fehler behoben.
from sqlalchemy import exc
from sqlalchemy import event
from sqlalchemy.pool import Pool
@event.listens_for(Pool, "checkout")
def ping_connection(dbapi_connection, connection_record, connection_proxy):
cursor = dbapi_connection.cursor()
try:
cursor.execute("SELECT 1")
except:
raise exc.DisconnectionError()
cursor.close()
Es gibt einige Websites, die dieses Problem erwähnen, aber ich habe versucht, diejenigen zu zitieren, die funktioniert haben. Die Site, die ich dieses Mal zitiert habe, hat auch verschiedene Trial-and-Error-Prozesse. Wenn Sie also mit ähnlichen Problemen konfrontiert sind, sollten Sie sich meiner Meinung nach auch darauf beziehen. Ich würde es begrüßen, wenn Sie mir sagen könnten, ob es einen besseren Weg gibt oder ob die Grundursache überhaupt nicht da ist.
--Python: Lösen Sie das Problem, dass mein MySQL-Server in SQLAlchemy verschwunden ist (http://blog.amedama.jp/entry/2015/08/15/133322).
Recommended Posts