[PYTHON] Accélération lors de la connexion de cx_Oracle à la base de données autonome

en premier

Dans cet article, DRCP (Database Resident Connection Pooling) est maintenant disponible dans Autonomous Database, alors essayez-le. Le résultat n'était pas bon, j'ai donc changé un peu l'environnement côté client et l'ai essayé. Si vous écrivez d'abord la conclusion,

Ce sera.

Environnement de vérification

--Oracle Cloud Région d'Osaka --Instance de calcul (environnement d'exécution d'application de test): VM.Standard2.1

L'enquête sur la cause du DRCP n'a pas été aussi rapide que prévu

Tout d'abord, je présenterai la source de l'application de vérification qui n'utilise pas DRCP. Tnsnames.ora est utilisé pour spécifier la destination de la connexion. Par conséquent, l'utilisation de DRCP est spécifiée dans tnsnames.ora.

test1.py


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

USERID = 'admin'
PASSWORD = 'Remplacement requis'
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'Temps total de connexion: {sum(elapsed_times)}Secondes')
print(f'Temps de connexion moyen: {sum(elapsed_times) / REPEAT_TIMES}Secondes')

Vient ensuite la source de l'application de vérification qui utilise DRCP.

test2.py


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

USERID = 'admin'
PASSWORD = 'Remplacement requis'
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'Temps total de connexion: {sum(elapsed_times)}Secondes')
print(f'Temps de connexion moyen: {sum(elapsed_times) / REPEAT_TIMES}Secondes')

En raison de l'exécution de ces applications plusieurs fois, les performances ont presque doublé lors de l'utilisation de DRCP. L'article d'origine comprend également l'heure de démarrage de SQL * Plus, le résultat est donc meilleur que l'article d'origine, mais je souhaite toujours plus de performances. Donc, en considérant d'abord la possibilité que le cryptage des communications soit un goulot d'étranglement, j'ai basculé la destination de la connexion sur Oracle Database Cloud Service (DBCS) qui peut altérer le côté serveur de base de données, supprimé le paramètre de cryptage et essayé, DRCP Le résultat est que avec est plus lent que sans. Accéléré uniquement sans DRCP. En d'autres termes, le cryptage des communications a peu d'impact lors de l'utilisation de DRCP. Ici, en consultation avec l'auteur de l'article original, j'ai essayé de régler DRCP (augmenter MINSIZE) sur DBCS. En conséquence, dans l'environnement DBCS, la vitesse de connexion DRCP a été multipliée par 10 environ même si la communication est cryptée. Nous avons déterminé que la cause directe était un réglage DRCP insuffisant et des paramètres qui ne correspondaient pas à la logique de l'application. Le problème ici est qu'avec ATP, vous ne pouvez pas modifier les paramètres DRCP. Par conséquent, ATP (qui semble être le même pour ADW) ne peut améliorer la vitesse de connexion qu'à un niveau raisonnable avec cette application de vérification. Cette fois, la connexion / déconnexion est répétée à partir d'une seule application, mais si vous démarrez plusieurs applications qui établissent une connexion avec l'outil de test et les exécutez à plusieurs reprises, des résultats différents seront obtenus.

Essayez la fonctionnalité de pool de connexions de cx_Oracle

Cx_Oracle, le pilote de connexion Oracle Database pour Python, dispose d'une fonctionnalité de pool de connexions. En utilisant cette fonction, vous pouvez vous attendre à une vitesse de connexion plus rapide même en l'absence de DRCP. Donc, quand j'ai essayé l'application suivante, cela a fonctionné très vite même lors de la connexion à ATP (cela a pris moins d'une seconde même si je me suis connecté 300 fois). La conclusion impitoyable était que DRCP ne serait pas nécessaire dans un environnement où le pool de connexions d'un pilote de connexion tel que Python (cx_Oracle) pourrait être utilisé. Juste au cas où, je pense que DRCP lui-même a une signification en raison de l'environnement où la fonction correspondante n'existe pas.

test3.py


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

USERID = 'admin'
PASSWORD = 'Remplacement requis'
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'Temps total de connexion: {sum(elapsed_times)}Secondes')
print(f'Temps de connexion moyen: {sum(elapsed_times) / REPEAT_TIMES}Secondes')

Rapport de performance de chaque motif

Enfin, je présenterai un graphique du ratio de performance des tests menés dans cet article. Les performances lors de l'utilisation du pool de connexions de cx_Oracle étaient si bonnes que cela ressemblait à un mensonge. .. .. screenshot.png

Recommended Posts

Accélération lors de la connexion de cx_Oracle à la base de données autonome
Connectez-vous à la base de données utf8mb4 à partir de python
Remarques sur la connexion Bluetooth d'un smartphone / PC à Raspeye 4
[Introduction à cx_Oracle] (Partie 2) Principes de base de la connexion et de la déconnexion à Oracle Database
Connexion de python à MySQL sur CentOS 6.4
Un script qui crée un binaire FlatBuffers à partir d'une base de données SQL
Points à noter lors du passage de NAOqi OS 2.4.3 à 2.5.5
Impossible de se connecter à MySQL depuis l'environnement Docker (Debian)
Ce que j'ai fait lors de la mise à jour de Python 2.6 vers 2.7
Sauvegarde de QNAP vers Linux avec rsync
Ce qui a échoué lors du passage de Javaer à Pythonista