[PYTHON] Beschleunigen Sie die Verbindung von cx_Oracle zur autonomen Datenbank

zunaechst

In diesem Artikel ist DRCP (Database Resident Connection Pooling) jetzt in Autonomous Database verfügbar. Probieren Sie es aus. Das Ergebnis war nicht gut, daher habe ich die Umgebung auf der Clientseite ein wenig geändert und es versucht. Wenn Sie die Schlussfolgerung zuerst schreiben,

Es wird sein.

Überprüfungsumgebung

Untersuchung der Ursache für die DRCP nicht so schnell wie erwartet

Zunächst werde ich die Quelle der Verifizierungsanwendung vorstellen, die kein DRCP verwendet. Tnsnames.ora wird verwendet, um das Verbindungsziel anzugeben. Daher wird die Verwendung von DRCP in tnsnames.ora angegeben.

test1.py


# -*- coding: utf-8 -*-
import cx_Oracle
import time

USERID = 'admin'
PASSWORD = 'Ersatz erforderlich'
DESTINATION = 'atp_low'
REPEAT_TIMES = 300
elapsed_times = []

for i in range(REPEAT_TIMES):
        t1 = time.time()
        connection = cx_Oracle.connect(USERID, PASSWORD, DESTINATION)
        t2 = time.time()
        connection.close()
        elapsed_times.append(t2 - t1)
print(f'Gesamtverbindungszeit: {sum(elapsed_times)}Sekunden')
print(f'Durchschnittliche Verbindungszeit: {sum(elapsed_times) / REPEAT_TIMES}Sekunden')

Als nächstes folgt die Quelle der Verifizierungsanwendung, die DRCP verwendet.

test2.py


# -*- coding: utf-8 -*-
import cx_Oracle
import time

USERID = 'admin'
PASSWORD = 'Ersatz erforderlich'
DESTINATION = 'atp_low_pooled'
REPEAT_TIMES = 300
elapsed_times = []

for i in range(REPEAT_TIMES):
        t1 = time.time()
        connection = cx_Oracle.connect(USERID, PASSWORD, DESTINATION, cclass='MYCLASS', purity=cx_Oracle.ATTR_PURITY_SELF)
        t2 = time.time()
        connection.close()
        elapsed_times.append(t2 - t1)
print(f'Gesamtverbindungszeit: {sum(elapsed_times)}Sekunden')
print(f'Durchschnittliche Verbindungszeit: {sum(elapsed_times) / REPEAT_TIMES}Sekunden')

Durch mehrmaliges Ausführen dieser Anwendungen hat sich die Leistung bei Verwendung von DRCP fast verdoppelt. Der Originalartikel enthält auch die Startzeit von SQL * Plus, sodass das Ergebnis besser ist als der Originalartikel, aber ich möchte immer noch mehr Leistung. Da ich zunächst die Möglichkeit in Betracht gezogen habe, dass die Kommunikationsverschlüsselung ein Engpass ist, habe ich das Verbindungsziel auf Oracle Database Cloud Service (DBCS) umgestellt, das die DB Server-Seite manipulieren kann, die Verschlüsselungseinstellung entfernt und DRCP ausprobiert Das Ergebnis ist, dass mit langsamer ist als ohne. Nur ohne DRCP beschleunigt. Mit anderen Worten, die Kommunikationsverschlüsselung hat bei Verwendung von DRCP nur geringe Auswirkungen. Hier habe ich in Absprache mit dem ursprünglichen Artikelautor versucht, DRCP (MINSIZE erhöhen) auf DBCS zu optimieren. Infolgedessen hat sich in der DBCS-Umgebung die DRCP-Verbindungsgeschwindigkeit etwa um das Zehnfache erhöht, selbst wenn die Kommunikation verschlüsselt ist. Wir haben festgestellt, dass die direkte Ursache eine unzureichende DRCP-Optimierung und Einstellungen waren, die nicht mit der Logik der Anwendung übereinstimmten. Das Problem hierbei ist, dass Sie mit ATP die DRCP-Einstellungen nicht ändern können. Daher kann ATP (das für ADW anscheinend gleich ist) mit dieser Verifizierungsanwendung die Verbindungsgeschwindigkeit nur auf einem vernünftigen Niveau verbessern. Dieses Mal wird die Verbindung / Trennung von einer einzelnen Anwendung aus wiederholt. Wenn Sie jedoch mehrere Anwendungen starten, die eine Verbindung mit dem Testtool herstellen, und diese wiederholt ausführen, werden unterschiedliche Ergebnisse erzielt.

Probieren Sie die Verbindungspoolfunktion von cx_Oracle aus

Cx_Oracle, der Oracle Database-Verbindungstreiber für Python, verfügt über Verbindungspoolfunktionen. Mit dieser Funktion können Sie auch ohne DRCP eine schnellere Verbindungsgeschwindigkeit erwarten. Als ich die folgende Anwendung ausprobierte, funktionierte sie sehr schnell, selbst wenn eine Verbindung zu ATP hergestellt wurde (es dauerte weniger als 1 Sekunde, selbst wenn ich 300 Mal eine Verbindung herstellte). Die rücksichtslose Schlussfolgerung war, dass DRCP in einer Umgebung, in der der Verbindungspool eines Verbindungstreibers wie Python (cx_Oracle) verwendet werden könnte, nicht benötigt wird. Für alle Fälle denke ich, dass DRCP selbst aufgrund der Umgebung, in der die entsprechende Funktion nicht vorhanden ist, eine Bedeutung hat.

test3.py


# -*- coding: utf-8 -*-
import cx_Oracle
import time

USERID = 'admin'
PASSWORD = 'Ersatz erforderlich'
DESTINATION = 'atp_low'
REPEAT_TIMES = 300
elapsed_times = []

pool = cx_Oracle.SessionPool(USERID, PASSWORD, DESTINATION, min=4, max=40, increment=1)

for i in range(REPEAT_TIMES):
        t1 = time.time()
        connection = pool.acquire()
        t2 = time.time()
        pool.release(connection)
        elapsed_times.append(t2 - t1)
pool.close()
print(f'Gesamtverbindungszeit: {sum(elapsed_times)}Sekunden')
print(f'Durchschnittliche Verbindungszeit: {sum(elapsed_times) / REPEAT_TIMES}Sekunden')

Leistungsverhältnis jedes Musters

Abschließend werde ich eine grafische Darstellung des Leistungsverhältnisses der in diesem Artikel durchgeführten Tests präsentieren. Die Leistung bei der Verwendung des Verbindungspools von cx_Oracle war so gut, dass es sich wie eine Lüge anfühlte. .. .. screenshot.png

Recommended Posts

Beschleunigen Sie die Verbindung von cx_Oracle zur autonomen Datenbank
Stellen Sie von Python aus eine Verbindung zur utf8mb4-Datenbank her
Hinweise zum Verbinden von Bluetooth von einem Smartphone / PC mit Raspeye 4
[Einführung in cx_Oracle] (Teil 2) Grundlagen zum Verbinden und Trennen mit Oracle Database
Herstellen einer Verbindung von Python zu MySQL unter CentOS 6.4
Ein Skript, das eine FlatBuffers-Binärdatei aus einer SQL-Datenbank erstellt
Zu beachtende Punkte beim Wechsel von NAOqi OS 2.4.3 zu 2.5.5
Es kann keine Verbindung zu MySQL über die Docker-Umgebung (Debian) hergestellt werden.
Was ich beim Update von Python 2.6 auf 2.7 gemacht habe
Sichern Sie mit rsync von QNAP auf Linux
Was ist fehlgeschlagen, als ich von Javaer zu Pythonista gewechselt bin?