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.
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.
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')
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. .. ..
Recommended Posts