[PYTHON] [Einführung in cx_Oracle] (13.) Verbindung über Verbindungspool (Client-Seite)

Serialisierungstabelle

Serie: Einführung in den Inhalt von cx_Oracle

Überprüfungsumgebung

Überblick

Die Standardverbindungsmethode für Oracle-Datenbanken ist keineswegs schnell. Es wird eher verspottet, wenn es langsam ist. Durch Verwendung der Verbindungspoolfunktion ist es jedoch möglich, eine mit anderen Produkten vergleichbare Verbindungsleistung zu erzielen. Und jetzt stellen wir sowohl auf der Serverseite als auch auf der Clientseite die Verbindungspoolfunktion als Funktion der Oracle-Datenbank selbst bereit. Mit Oracle Database können Sie von Verbindungspools in jeder Verbindungsumgebung profitieren, nicht nur in Python. Die serverseitige Verbindungspoolfunktion (DRCP (Database Resident Connection Pool), datenbankresidentes Verbindungspooling) ist eine serverseitige Funktion und kann in jeder Umgebung verwendet werden. Wenn Sie an serverseitigen Einstellungen interessiert sind, siehe unten. Um DRCP verwenden zu können, müssen jedoch zum Zeitpunkt der Verbindung Optionen angegeben werden, damit der Teil, für den eine Codierung erforderlich ist, zu einem anderen Zeitpunkt erläutert wird. Dieses Mal werde ich den Verbindungspool auf der Clientseite erläutern.

(Referenz) Setzen Sie MINSIZE und MAXSIZE von DRCP (Database Resident Connection Pooling) von Oracle Database auf 1 und versuchen Sie, eine Verbindung aus mehreren Sitzungen herzustellen.

Clientseitiger Verbindungspool

cx_Oracle verfügt über eine API zur Verwendung der clientseitigen Verbindungspoolfunktion von Oracle Client. Wenn Sie einen clientseitigen Verbindungspool verwenden, erstellen Sie zunächst einen Verbindungspool (Sitzungspool). Die Verbindung wird dann hergestellt, indem anstelle der Methode connect () des Objekts cx_Oracle anstelle der Methode connect () des Verbindungsobjekts die Sitzung aus dem Pool abgerufen wird.

sample13a.py


import cx_Oracle
import time

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"

#Normale Messung der Verbindungsgeschwindigkeit
t1 = time.time()
connection = cx_Oracle.connect(USERID, PASSWORD, DESTINATION)
t2 = time.time()
connection.close()
print(f"Verbindungszeit, wenn der Pool nicht verwendet wird: {t2 - t1}Sekunden")

#Messung der Verbindungsgeschwindigkeit des Verbindungspools
pool = cx_Oracle.SessionPool(USERID, PASSWORD, DESTINATION, min=1, max=2, increment=1)
t1 = time.time()
connection = pool.acquire()
t2 = time.time()
pool.release(connection)
print(f"Verbindungszeit bei Verwendung des Pools: {t2 - t1}Sekunden")

In der sechsten Zeile von unten wird cx_Oracle.SessionPool () aufgerufen, um einen Sitzungspool (Verbindungspool) zu erstellen. Die ersten drei Argumente ähneln Connection.connect (). Das vierte und die folgenden Argumente geben die Größe des zu erstellenden Verbindungspools an. min ist die minimale Anzahl von Verbindungen, max ist die maximale Anzahl von Verbindungen und Inkrement ist der Inkrementwert zum Erhöhen der Anzahl von Sitzungen von min auf max. Die Werte in den Proben sind die Standardwerte für alle drei. Wenn Ihre Anwendung Multithreading verwendet, geben Sie True für das Thread-Argument an. Es wird empfohlen, dass die Min- und Max-Werte gleich sind und die Anzahl der Sitzungen festgelegt wird, um einen Leistungsaufwand aufgrund der Zunahme oder Abnahme der Anzahl der Sitzungen zu vermeiden. Passen Sie die angegebene Anzahl an den Betriebsstatus der Anwendung an. Rufen Sie die release () -Methode auf, um die gesicherte Verbindung zu beenden (freizugeben). Geben Sie die Verbindung (in diesem Beispiel "Verbindung") an, für die () im Argument angegeben ist.

Das Ausführungsergebnis kann aufgrund von Umständen für Erwachsene nicht veröffentlicht werden. Wenn Sie es jedoch versuchen, können Sie feststellen, dass die Verbindung bei Verwendung des Verbindungspools überwiegend schneller ist. Dieses Beispiel enthält jedoch nicht die Erstellungszeit des Sitzungspools in der Verbindungszeit. Wenn Sie es unabhängig vom Wert im obigen Beispiel einschließen, dauert die Erstellung des Pools umso länger, je größer der Mindestwert ist, sodass die normale Verbindung schneller ist. In Bezug auf die ordnungsgemäße Verwendung der normalen Verbindung und des Verbindungspools ist es möglich, die normale Verbindung mehrmals mit der Datenbank zu verbinden, z. B. eine Anwendung ohne Server, für Anwendungen wie Stapelverarbeitungsanwendungen, bei denen die Anzahl der Verbindungen häufig eins beträgt. Ich denke, es ist besser, den Verbindungspool für die erwartete Anwendung zu verwenden.

Heterogener Verbindungspool und homologer Verbindungspool

Heterogen und Homogen im Titel geben an, ob alle verbundenen Benutzer im selben Verbindungspool gleich (gleicher Typ) oder nicht (heterogen) sind. Der Standardwert ist homogen. Bei dem bisher erläuterten Verbindungspool des gleichen Typs ist der Verbindungsbenutzer fest, bei dem unten erläuterten heterogenen Verbindungspool ist es jedoch möglich, Benutzer zu mischen. Die Verbindungsgeschwindigkeit ist zwar flexibel, aber langsamer als bei ähnlichen Verbindungspools, da Sie sich jedes Mal authentifizieren müssen. cx_Oracle.SessionPool () hat ein Standardargument von True, das als homogen bezeichnet wird. Wenn Sie dies in "Falsch" ändern und eine Verbindung herstellen, können Sie für jede Sitzung unterschiedliche Benutzer angeben. Geben Sie den Benutzernamen und das Kennwort in Connection.acquire () anstelle von cx_Oracle.SessionPool () an.

sample13b.py


import cx_Oracle
import time

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"

#Homogener Verbindungspool
pool = cx_Oracle.SessionPool(USERID, PASSWORD, DESTINATION, min=2, max=2)
t1 = time.time()
connection = pool.acquire()
t2 = time.time()
pool.release(connection)
print(f"Verbindungszeit bei Verwendung des Verbindungspools desselben Typs: {t2 - t1}Sekunden")

#Heterogener Verbindungspool
pool = cx_Oracle.SessionPool(dsn=DESTINATION, min=2, max=2, homogeneous=False)
t1 = time.time()
connection = pool.acquire(user=USERID, password=PASSWORD)
t2 = time.time()
pool.release(connection)
print(f"Verbindungszeit bei Verwendung eines heterogenen Verbindungspools: {t2 - t1}Sekunden")

Beachten Sie, dass die Argumentnamen (Benutzer, Kennwort, dsn) für die Argumente für Benutzername, Kennwort und Verbindungszielinformationen erforderlich sind.

Recommended Posts

[Einführung in cx_Oracle] (13.) Verbindung über Verbindungspool (Client-Seite)
[Cx_Oracle Primer] (Teil 3) Grundlagen zum Durchsuchen von Tabellen
[Einführung in cx_Oracle] (Teil 7) Umgang mit Bindevariablen
Einführung in PyQt4 Teil 1
[Einführung in cx_Oracle] (Teil 11) Grundlagen der PL / SQL-Ausführung
[Einführung in cx_Oracle] Übersicht über cx_Oracle
[Einführung in cx_Oracle] (8.) Version cx_Oracle 8.0
Einführung in discord.py (3) Verwenden von Stimme
Einführung in Ansible Teil In'Inventory '
Serie: Einführung in den Inhalt von cx_Oracle
Einführung in Ansible Teil ④'Variable '
[Einführung in cx_Oracle] (Teil 6) Zuordnung von DB- und Python-Datentypen
Einführung in die Socket-API in C Language 2nd Client Edition
Einführung in die Socket-API in C-Sprache 3. TCP-Server / Client Nr. 1
Einführung in Ansible Teil 2 'Grundlegende Grammatik'
Einführung in Python Hands On Teil 1
[Einführung in cx_Oracle] (Teil 2) Grundlagen zum Verbinden und Trennen mit Oracle Database
Einführung in Ansible Teil 1'Hallo Welt !! '
Einführung in die in C-Sprache gelernte Socket-API 4. UDP Server / Client Edition Nr. 1
Python-Anfänger veröffentlichen Web-Apps mit maschinellem Lernen [Teil 2] Einführung in explosives Python !!
Einführung in die diskrete Ereignissimulation mit Python # 1
Web-WF Python Tornado Teil 3 (Einführung in Openpyexcel)
[PyTorch] Einführung in die Dokumentklassifizierung mit BERT
[Einführung in cx_Oracle] (12.) DB-Ausnahmebehandlung
[Einführung in cx_Oracle] (17.) Datumsbehandlung
Einführung in die diskrete Ereignissimulation mit Python # 2
Einführung in Tornado (3): Entwicklung mit Vorlagen [Übung]
Kaggle: Einführung in das manuelle Feature Engineering Teil 1
[Einführung in cx_Oracle] (Teil 9) Zuordnung von DB- und Python-Datentypen (Version 8 oder höher)
[Einführung in cx_Oracle] (16.) Umgang mit LOB-Typen
[PyTorch] Einführung in die Klassifizierung japanischer Dokumente mit BERT
[Einführung in cx_Oracle] (5.) Umgang mit japanischen Daten
Einführung in Tornado (2): Einführung in die Entwicklung mit Vorlagen - Dynamische Seitengenerierung -
Einführung in Scapy ② (ICMP, HTTP (TCP) -Übertragung mit Scapy)