Ich bin mir nicht sicher, wie es sich verhält, wenn es mit einem Datensatz geschlossen wird, daher werde ich verschiedene Dinge versuchen, um es zu organisieren.
4.14.193-149.317.amzn2.x86_64 #1 SMP Thu Sep 3 19:04:44 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Python 3.8.5
Das Folgende ist der Zustand, in dem die Pip-Installation durchgeführt wird. dataset 1.3.2 SQLAlchemy 1.3.19 mysqlclient 1.4.6
Zunächst aus der Schlussfolgerung. ..
Wenn Sie den Verbindungspool behalten möchten, müssen Sie ihn nicht schließen (siehe Bedingung 0).
Wenn Sie die Datenbank trennen möchten, überprüfen Sie die Bedingung 6
con.executable.invalidate()
con.executable.engine.dispose()
Übrigens ist die Bedeutung der Nummer von "pool.status ()" im Überprüfungsergebnis atmosphärisch ↓.
Pool size:Wie es ist
Connections in pool:Anzahl der DB-Verbindungen, die als Pool verwendet werden können
Current Overflow:Bis zu wie viele weitere Verbindungen können hergestellt werden (max.)_Da der Standardwert für den Überlauf 10 ist,-10 leer)
Current Checked out connections:Anzahl der DB-Verbindungen, die der Thread hält
Der folgende Ablauf.
Ausführung auswählen ↓ Prozess schließen ↓ Status anzeigen ↓ Wählen Sie erneut mit demselben Con ↓ Prozess schließen ↓ Status anzeigen
Es wird angenommen, dass ↓ ausgeführt wird.
con = dataset.connect(
'mysql://root:[email protected]:3306/hoge',
engine_kwargs={
'pool_size': 10,
# 'max_overflow': 0,
}
)
for record in con['table1']:
print(record)
Der Zustand zum Zeitpunkt der ersten "Auswahlausführung" ist einheitlich ↓.
con.executable.closed : False
con.executable.invalidated: False
con.engine.pool.status() :
Pool size: 10 Connections in pool: 0 Current Overflow: -9 Current Checked out connections: 1
Führen Sie für MySQL jede Sekunde show processlist \ g
aus, um festzustellen, ob eine Verbindung zur Datenbank besteht.
Der Abschlussprozess "con.executable.xxxx ()" führt eine SQL Alchemy-Funktion aus.
Nicht schließen ausführen.
Ausführung auswählen
↓
Verwenden Sie con erneut und wählen Sie erneut aus
↓
Verbindung wird wiederverwendet (Pool funktioniert)
Nach der ersten Ausführung
con.engine.pool.status() :
Pool size: 10 Connections in pool: 0 Current Overflow: -9 Current Checked out connections: 1
↓
Nach der zweiten Ausführung
con.engine.pool.status() :
Pool size: 10 Connections in pool: 0 Current Overflow: -9 Current Checked out connections: 1
Führen Sie SQL gleichzeitig für 10 Threads aus
↓
Wenn alle Threads fertig sind, verwenden Sie con erneut, um SQL für 10 Threads gleichzeitig auszuführen.
↓
Verbindung wird wiederverwendet (Pool funktioniert)
※`max_overflow`Zu`0`Ansonsten der Standardwert`10`Ist`pool_size`Seien Sie vorsichtig, da es überschreiten wird
* Die DB-Verbindung wird ohne Erlaubnis freigegeben, wenn der Thread endet (was ist mit Python-Threads?)
Nach der ersten Ausführung
con.engine.pool.status() :
Pool size: 10 Connections in pool: 9 Current Overflow: 0 Current Checked out connections: 1
↓
Nach der zweiten Ausführung
con.engine.pool.status() :
Pool size: 10 Connections in pool: 10 Current Overflow: 1 Current Checked out connections: 1
* Überlauf wurde aktiviert. ..
Es wird bestätigt, dass die Prozess-ID auf der MySQL-Seite des zuerst gesendeten SQL mit der Prozess-ID des zweiten Mal übereinstimmt.
Gleiches gilt beim Ausführen in einem Thread. Wenn 10 Threads gleichzeitig ausgeführt werden und die ID zum ersten Mal 1,2,3,4,5,6,7,8,9,10 beträgt, beträgt die ID zum zweiten Mal 1,2,3,4,5,6. Es wird bestätigt, dass es 7,8,9,10 ist.
Wenn Sie mit "pool_size: 10, max_overflow: 0" 20 Threads ausführen, wird dies so eingeschränkt, dass "poo_size" nicht ordnungsgemäß überschritten wird.
** Vielleicht ist das die richtige Antwort. .. ** ** **
con.close()
Nicht getrennt.
con.executable.closed : False
con.executable.invalidated: False
con.engine.pool.status() :Kann nicht rennen
Sie können dies tun und Ergebnisse erhalten (Verbindungen werden wiederverwendet).
Das zweite con.close ()
ergibt jedoch einen ↓ Fehler.
'NoneType' object has no attribute 'dispose'
Eine Verbindung zum Pool zurückgeben und eine Verbindung im Pool haben (wahrscheinlich). Ich kann die Details der Poolverwaltung nicht sehen, da ich pool.status () nicht sehen kann.
Beachten Sie, dass die Verbindung zur Datenbank selbst nicht unterbrochen ist.
Der Motor
im con
wird gelöscht. (Das heißt, ich weiß nicht, was das bedeutet ...)
Außerdem gibt close ()
beim zweiten Mal einen Fehler aus, sodass er unbrauchbar ist.
Es gibt eine Theorie, dass Sie nicht in erster Linie schließen müssen.
con.close()
con.executable.engine.dispose()
Nicht getrennt.
con.executable.closed : False
con.executable.invalidated: False
con.engine.pool.status() :Kann nicht rennen
Sie können dies tun und Ergebnisse erhalten (Verbindungen werden wiederverwendet).
Das zweite con.close ()
ergibt jedoch einen ↓ Fehler.
'NoneType' object has no attribute 'dispose'
Die Bedingung ändert sich nicht von Bedingung 1.
con.executable.close()
Nicht getrennt.
con.executable.closed : True
con.executable.invalidated: False
con.engine.pool.status() :
Pool size: 10 Connections in pool: 1 Current Overflow: -9 Current Checked out connections: 0
↓ erscheint und kann nicht ausgeführt werden.
(sqlalchemy.exc.ResourceClosedError) This Connection is closed
Gibt eine Verbindung zum Pool zurück und der Pool hat eine Verbindung.
con.executable.closed
wird True
, aber ich weiß nicht, was es bedeutet. ..
Ich kann select nicht erneut ausführen, und die Datenbank ist nicht getrennt, sodass sie sich nutzlos anfühlt.
con.executable.close()
con.executable.engine.dispose()
Getrennt sein.
con.executable.closed : True
con.executable.invalidated: False
con.engine.pool.status() :
Pool size: 10 Connections in pool: 0 Current Overflow: -10 Current Checked out connections: 0
↓ erscheint und kann nicht ausgeführt werden.
(sqlalchemy.exc.ResourceClosedError) This Connection is closed
Die Verbindung zur Datenbank ist unterbrochen (die gepoolte Verbindung verschwindet) Ich habe das Gefühl, dass es für die endgültige Verarbeitung ist, da ich select nicht erneut ausführen kann.
con.executable.invalidate()
Getrennt sein.
Die DB-Verbindung ist unterbrochen, die Verbindung bleibt jedoch im Pool.
con.executable.closed : False
con.executable.invalidated: True
con.engine.pool.status() :
Pool size: 10 Connections in pool: 1 Current Overflow: -9 Current Checked out connections: 0
Ich konnte es normal ausführen. Da es einmal getrennt wurde, wird es wieder verbunden (die ID des Prozesses, der SQL auf der MySQL-Seite ausführt, ändert sich).
#Status nach Ausführung von select
con.executable.closed : False
con.executable.invalidated: False
con.engine.pool.status() :
Pool size: 10 Connections in pool: 0 Current Overflow: -9 Current Checked out connections: 1
#Zustand nach enger Ausführung
con.executable.closed : False
con.executable.invalidated: True
con.engine.pool.status() :
Pool size: 10 Connections in pool: 1 Current Overflow: -9 Current Checked out connections: 0
Die Verbindung zur Datenbank ist unterbrochen (es gibt keine gepoolten Verbindungen). Die eigentliche DB-Verbindung ist unterbrochen, aber ich bin der Meinung, dass sie nicht in einem sehr guten Zustand ist, da sie im Hinblick auf die Poolverwaltung verbunden ist.
con.executable.invalidate()
con.executable.engine.dispose()
Getrennt sein.
con.executable.closed : False
con.executable.invalidated: True
con.engine.pool.status() :
Pool size: 10 Connections in pool: 0 Current Overflow: -10 Current Checked out connections: 0
Ich konnte es normal ausführen. Da es einmal getrennt wurde, wird es wieder verbunden (die ID des Prozesses, der SQL auf der MySQL-Seite ausführt, ändert sich).
#Status nach Ausführung von select
con.executable.closed : False
con.executable.invalidated: False
con.engine.pool.status() :
Pool size: 10 Connections in pool: 0 Current Overflow: -9 Current Checked out connections: 1
#Zustand nach enger Ausführung
con.executable.closed : False
con.executable.invalidated: True
con.engine.pool.status() :
Pool size: 10 Connections in pool: 0 Current Overflow: -10 Current Checked out connections: 0
Die Verbindung zur Datenbank ist unterbrochen (es gibt keine gepoolten Verbindungen). Der tatsächliche DB-Verbindungsstatus und der Poolverwaltungsstatus stimmen überein und sehen am besten aus, wenn die ausgewählte Neuausführung nach dem Schließen enthalten ist.
Recommended Posts