Untersuchen Sie die genaue Verarbeitung des Python-Datasets (SQLAlchemy-Wrapper).

Überblick

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.

Umgebung

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

Fazit

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

Ermittlung

Der folgende Ablauf.

Ausführung auswählen ↓ Prozess schließen ↓ Status anzeigen ↓ Wählen Sie erneut mit demselben Con ↓ Prozess schließen ↓ Status anzeigen

Annahme

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

** Zum Punkt "Ob die DB-Verbindung getrennt ist" **

Führen Sie für MySQL jede Sekunde show processlist \ g aus, um festzustellen, ob eine Verbindung zur Datenbank besteht.

Bemerkungen

Der Abschlussprozess "con.executable.xxxx ()" führt eine SQL Alchemy-Funktion aus.

Umfrageergebnisse

Bedingung 0 (Abschlussverarbeitung nicht ausführen)

Nicht schließen ausführen.

Überprüfung 1

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

Überprüfung 2

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. ..

So überprüfen Sie, wie die Verbindung verwendet wird

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.

Beiseite

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.

Zusammenfassung

** Vielleicht ist das die richtige Antwort. .. ** ** **

Bedingung 1 (con.close ())

con.close()

Gibt an, ob die DB-Verbindung getrennt ist

Nicht getrennt.

Nach dem Ausführen schließen

con.executable.closed     : False
con.executable.invalidated: False
con.engine.pool.status()  :Kann nicht rennen

Was passiert, wenn Sie nach dem Schließen dieselbe Con auswählen?

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'

Zusammenfassung

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.

Bedingung 2 (con.close (); con.executable.engine.dispose ())

con.close()
con.executable.engine.dispose()

Gibt an, ob die DB-Verbindung getrennt ist

Nicht getrennt.

Nach dem Ausführen schließen

con.executable.closed     : False
con.executable.invalidated: False
con.engine.pool.status()  :Kann nicht rennen

Was passiert, wenn Sie nach dem Schließen dieselbe Con auswählen?

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'

Zusammenfassung

Die Bedingung ändert sich nicht von Bedingung 1.

Bedingung 3 (con.executable.close ())

con.executable.close()

Gibt an, ob die DB-Verbindung getrennt ist

Nicht getrennt.

Nach dem Ausführen schließen

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

Was passiert, wenn Sie nach dem Schließen dieselbe Con auswählen?

↓ erscheint und kann nicht ausgeführt werden.

(sqlalchemy.exc.ResourceClosedError) This Connection is closed

Zusammenfassung

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.

Bedingung 4 (con.executable.close (); con.executable.engine.dispose ())

con.executable.close()
con.executable.engine.dispose()

Gibt an, ob die DB-Verbindung getrennt ist

Getrennt sein.

Nach dem Ausführen schließen

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

Was passiert, wenn Sie nach dem Schließen dieselbe Con auswählen?

↓ erscheint und kann nicht ausgeführt werden.

(sqlalchemy.exc.ResourceClosedError) This Connection is closed

Zusammenfassung

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.

Bedingung 5 (con.executable.invalidate ())

con.executable.invalidate()

Gibt an, ob die DB-Verbindung getrennt ist

Getrennt sein.

Nach dem Ausführen schließen

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

Was passiert, wenn Sie nach dem Schließen dieselbe Con auswählen?

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

Zusammenfassung

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.

Bedingung 6 (con.executable.invalidate (); con.executable.engine.dispose ())

con.executable.invalidate()
con.executable.engine.dispose()

Gibt an, ob die DB-Verbindung getrennt ist

Getrennt sein.

Nach dem Ausführen schließen

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

Was passiert, wenn Sie nach dem Schließen dieselbe Con auswählen?

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

Zusammenfassung

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

Untersuchen Sie die genaue Verarbeitung des Python-Datasets (SQLAlchemy-Wrapper).
Die Geschichte der Verarbeitung A von Blackjack (Python)
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Bildverarbeitung? Die Geschichte, Python für zu starten
der Zen von Python
Verschiedene Verarbeitung von Python
Auf dem Weg zum Ruhestand von Python2
Nachbearbeitung von Python (NG)
Über die Funktionen von Python
Die Kraft der Pandas: Python
Überlassen Sie die mühsame Verarbeitung Python
Die Geschichte von Python und die Geschichte von NaN
[Python] Der Stolperstein des Imports
Erster Python 3 ~ Der Beginn der Wiederholung ~
Existenz aus Sicht von Python
pyenv-change die Python-Version von virtualenv
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[Python] Die potenzielle Feldplanung von Python Robotics verstehen
Überprüfung der Grundlagen von Python (FizzBuzz)
Untersuchen Sie die Klasse eines Objekts mit Python
Über das Verhalten von Yield_per von SqlAlchemy
Informationen zur Grundlagenliste der Python-Grundlagen
Lernen Sie die Grundlagen von Python ① Grundlegende Anfänger
Erhalten Sie eine Liste der Ergebnisse der Parallelverarbeitung in Python mit Starmap
Verarbeitung, wenn die Schlüsseleingabe von Python-Pygame nicht gut funktioniert.
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
python> print> Wird es erst am Ende des Prozesses umgeleitet?> Mit -u ausführen
Grundlagen der binärisierten Bildverarbeitung durch Python
Ändern Sie die Länge der Python-CSV-Zeichenfolgen
Überprüfen Sie das Verhalten des Zerstörers in Python
[Python3] Verstehe die Grundlagen von Beautiful Soup
Übergeben Sie den Pfad des importierten Python-Moduls
Notizen vom Anfang von Python 1 lernen
[Python3] Schreiben Sie das Codeobjekt der Funktion neu
Ich kannte die Grundlagen von Python nicht
Graustufen durch Matrix-Reinventor der Python-Bildverarbeitung-
[Python] Probieren Sie pydash der Python-Version von lodash aus
[Python] Überprüfen Sie den Speicherverbrauch von Variablen
Überprüfen Sie den Pfad des importierten Python-Moduls
Die Geschichte der Manipulation globaler Python-Variablen
[Python] [Meta] Ist der Python-Typ ein Typ?
Grundlagen zum Ausführen von NoxPlayer in Python
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Die Python-Projektvorlage, an die ich denke.
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Auf der Suche nach dem schnellsten FizzBuzz in Python
Python-Grundkurs (Ende 15)
Legen Sie den Prozessnamen des Python-Programms fest
[Python] Ruft den Zeichencode der Datei ab
Lernen Sie intuitiv die Umformung von Python np
Python Hinweis: Die geheime Rolle von Kamma
Notizen vom Anfang von Python 2 lernen
Status jedes Python-Verarbeitungssystems im Jahr 2020
Faltungsfilterung durch Matrix-Reinventor der Python-Bildverarbeitung-
Japanische Übersetzung: PEP 20 - Das Zen von Python
[Python3] Grundlegendes zu Dateivorgängen
Verarbeitung (Python) Diagramm der Koordinaten der Liste Geben Sie an, wie oft in draw ()