Examiner le traitement de fermeture de l'ensemble de données Python (wrapper SQLAlchemy)

Aperçu

Je ne sais pas comment il se comporte lorsqu'il est fermé avec un ensemble de données, je vais donc essayer différentes choses pour l'organiser.

environnement

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

Voici l'état où l'installation de pip est effectuée. dataset 1.3.2 SQLAlchemy 1.3.19 mysqlclient 1.4.6

Conclusion

D'abord de la conclusion. ..

Si vous souhaitez conserver le pool de connexions, vous n'avez pas besoin de le fermer (voir la condition 0).

Si vous souhaitez déconnecter le DB, vérifiez la condition 6

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

Au fait, la signification du nombre de «pool.status ()» dans le résultat de la vérification est ↓ atmosphérique.

Pool size:Tel quel
Connections in pool:Nombre de connexions DB pouvant être utilisées comme pool
Current Overflow:Jusqu'à combien de connexions supplémentaires peuvent être établies (max)_Puisque la valeur par défaut du débordement est 10,-10 vides)
Current Checked out connections:Nombre de connexions DB que le thread tient

enquête

Le flux suivant.

sélectionner l'exécution ↓ fermer le processus ↓ Afficher l'état ↓ Sélectionnez à nouveau en utilisant le même con ↓ fermer le processus ↓ Afficher l'état

supposition

On suppose que ↓ est exécuté.

con = dataset.connect(
    'mysql://root:[email protected]:3306/hoge',
    engine_kwargs={
        'pool_size': 10,
        # 'max_overflow': 0,
    }
)

for record in con['table1']:
    print(record)

L'état au moment de la première "exécution de sélection" est uniformément ↓.

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

** Concernant l'élément "Si la connexion DB est déconnectée" **

Pour MySQL, exécutez show processlist \ g toutes les secondes pour voir s'il est connecté à la base de données.

Remarques

Le processus de fermeture con.executable.xxxx () exécute une fonction SQL Alchemy.

Résultats du sondage

Condition 0 (ne pas exécuter le traitement de clôture)

N'exécutez pas close.

Vérification 1

sélectionner l'exécution
↓
Utilisez à nouveau con et sélectionnez à nouveau
↓
La connexion est réutilisée (la piscine fonctionne)
Après la première exécution
con.engine.pool.status()  : 
Pool size: 10  Connections in pool: 0 Current Overflow: -9 Current Checked out connections: 1
↓
Après la deuxième exécution
con.engine.pool.status()  : 
Pool size: 10  Connections in pool: 0 Current Overflow: -9 Current Checked out connections: 1

Vérification 2

Exécutez SQL en même temps pour 10 threads
↓
Une fois tous les threads terminés, utilisez à nouveau con pour exécuter SQL pour 10 threads en même temps.
↓
La connexion est réutilisée (la piscine fonctionne)

※`max_overflow`À`0`Sinon, la valeur par défaut`10`Est`pool_size`Attention car il dépassera
* La connexion DB est libérée sans autorisation lorsque le thread se termine (qu'en est-il des threads Python?)
Après la première exécution
con.engine.pool.status()  : 
Pool size: 10  Connections in pool: 9 Current Overflow: 0 Current Checked out connections: 1
↓
Après la deuxième exécution
con.engine.pool.status()  : 
Pool size: 10  Connections in pool: 10 Current Overflow: 1 Current Checked out connections: 1
* Le débordement a été activé. ..

Comment vérifier comment utiliser la connexion

Il est confirmé que l'ID de processus du côté MySQL du SQL qui a été envoyé en premier correspond à l'ID de processus de la deuxième fois.

La même chose s'applique lors de l'exécution dans un thread. Lorsque 10 threads sont exécutés en même temps, si l'ID est 1,2,3,4,5,6,7,8,9,10 pour la première fois, l'ID est 1,2,3,4,5,6 pour la deuxième fois. Il est confirmé qu'il est 7,8,9,10.

De côté

Avec pool_size: 10, max_overflow: 0, si vous exécutez 20 threads, il est restreint afin qu'il ne dépasse pas correctement poo_size.

Résumé

** C'est peut-être la bonne réponse. .. ** **

Condition 1 (con.close ())

con.close()

Si la connexion DB est déconnectée

Non déconnecté.

Après avoir exécuté close

con.executable.closed     : False
con.executable.invalidated: False
con.engine.pool.status()  :Je ne peux pas courir

Que se passe-t-il si vous sélectionnez en utilisant le même con après la fermeture

Vous pouvez le faire et obtenir des résultats (les connexions sont réutilisées). Cependant, le second con.close () donne une erreur ↓.

'NoneType' object has no attribute 'dispose'

Résumé

Retour d'une connexion au pool et avoir une connexion dans le pool (probablement). Je ne peux pas voir les détails de la gestion de la piscine car je ne peux pas voir pool.status ().

Notez que la connexion avec la base de données elle-même n'est pas interrompue. ʻEngine in con` est supprimé. (Autrement dit, je ne sais pas ce que cela signifie ...)

De plus, close () donne une erreur la deuxième fois, donc c'est inutile.

Il existe une théorie selon laquelle vous n'êtes pas obligé de «fermer ()» en premier lieu.

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

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

Si la connexion DB est déconnectée

Non déconnecté.

Après avoir exécuté close

con.executable.closed     : False
con.executable.invalidated: False
con.engine.pool.status()  :Je ne peux pas courir

Que se passe-t-il si vous sélectionnez en utilisant le même con après la fermeture

Vous pouvez le faire et obtenir des résultats (les connexions sont réutilisées). Cependant, le second con.close () donne une erreur ↓.

'NoneType' object has no attribute 'dispose'

Résumé

La condition ne change pas de la condition 1.

Condition 3 (con.executable.close ())

con.executable.close()

Si la connexion DB est déconnectée

Non déconnecté.

Après avoir exécuté close

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

Que se passe-t-il si vous sélectionnez en utilisant le même con après la fermeture

↓ apparaît et ne peut pas être exécuté.

(sqlalchemy.exc.ResourceClosedError) This Connection is closed

Résumé

Renvoie une connexion au pool et le pool a une connexion. «con.executable.closed» devient «True», mais je ne sais pas ce que cela signifie. .. Cela semble inutile car select ne peut pas être réexécuté et le DB n'est pas déconnecté.

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

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

Si la connexion DB est déconnectée

Soyez déconnecté.

Après avoir exécuté close

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

Que se passe-t-il si vous sélectionnez en utilisant le même con après la fermeture

↓ apparaît et ne peut pas être exécuté.

(sqlalchemy.exc.ResourceClosedError) This Connection is closed

Résumé

La connexion avec le DB est perdue (la connexion mise en pool disparaît) J'ai l'impression que c'est pour le traitement final car je ne peux pas réexécuter select.

Condition 5 (con.executable.invalidate ())

con.executable.invalidate()

Si la connexion DB est déconnectée

Soyez déconnecté.

Après avoir exécuté close

La connexion à la base de données est interrompue, mais la connexion reste dans le 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

Que se passe-t-il si vous sélectionnez en utilisant le même con après la fermeture

J'ai pu l'exécuter normalement. Puisqu'il a été déconnecté une fois, il est reconnecté (l'ID du processus exécutant SQL du côté MySQL change).

#État après l'exécution de 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

#État après exécution rapprochée

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

Résumé

La connexion avec le DB est perdue (il n'y a pas de connexions groupées). La connexion à la base de données actuelle est interrompue, mais j'estime qu'elle n'est pas en très bon état car c'est un organe connecté en termes de gestion de piscine.

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

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

Si la connexion DB est déconnectée

Soyez déconnecté.

Après avoir exécuté close

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

Que se passe-t-il si vous sélectionnez en utilisant le même con après la fermeture

J'ai pu l'exécuter normalement. Puisqu'il a été déconnecté une fois, il est reconnecté (l'ID du processus exécutant SQL du côté MySQL change).

#État après l'exécution de 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

#État après exécution rapprochée

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

Résumé

La connexion avec le DB est perdue (il n'y a pas de connexions groupées). L'état réel de la connexion à la base de données et l'état de gestion du pool correspondent, et il semble le plus sain lorsque la réexécution de la sélection après la fermeture est incluse.

Recommended Posts

Examiner le traitement de fermeture de l'ensemble de données Python (wrapper SQLAlchemy)
L'histoire du traitement A du blackjack (python)
Afficher le résultat du traitement de la géométrie en Python
Traitement d'image? L'histoire du démarrage de Python pour
le zen de Python
Divers traitements de Python
Vers la retraite de Python2
Post-traitement de python (NG)
À propos des fonctionnalités de Python
Le pouvoir des pandas: Python
Laissez le traitement gênant à Python
L'histoire de Python et l'histoire de NaN
[Python] La pierre d'achoppement de l'importation
First Python 3 ~ Le début de la répétition ~
Existence du point de vue de Python
pyenv-changer la version python de virtualenv
Une fonction qui mesure le temps de traitement d'une méthode en python
[Python] Comprendre le potentiel_field_planning de Python Robotics
Revue des bases de Python (FizzBuzz)
Examiner la classe d'un objet avec python
À propos du comportement de yield_per de SqlAlchemy
À propos de la liste de base des bases de Python
Apprenez les bases de Python ① Débutants élémentaires
Recevez une liste des résultats du traitement parallèle en Python avec starmap
Traitement lorsque l'entrée clé de pygame Python ne se passe pas bien.
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
python> print> Est-il redirigé uniquement à la fin du processus?> Exécuter avec -u
Bases du traitement d'images binarisées par Python
Changer la longueur des chaînes csv Python
Vérifiez le comportement du destroyer en Python
[Python3] Comprendre les bases de Beautiful Soup
Passez le chemin du module python importé
Notes d'apprentissage depuis le début de Python 1
[Python3] Réécrire l'objet code de la fonction
Je ne connaissais pas les bases de Python
Échelle de gris par matrice-Reinventor of Python image processing-
[Python] Essayez pydash de la version Python de lodash
[python] Vérifier la consommation de mémoire des variables
Vérifiez le chemin du module importé Python
L'histoire de la manipulation des variables globales Python
[python] [meta] Le type de python est-il un type?
Principes de base pour exécuter NoxPlayer en Python
Pandas du débutant, par le débutant, pour le débutant [Python]
Le modèle de projet Python auquel je pense.
Dessin avec Matrix-Reinventor of Python Image Processing-
À la recherche du FizzBuzz le plus rapide en Python
Cours de base Python (à la fin de 15)
Définissez le nom du processus du programme Python
[Python] Récupère le code de caractère du fichier
Apprenez intuitivement la refonte de Python np
Note Python: le rôle secret de Kamma
Notes d'apprentissage depuis le début de Python 2
Statut de chaque système de traitement Python en 2020
Filtrage par convolution par matrice-Reinventor of Python image processing-
Traduction japonaise: PEP 20 - Le Zen de Python
[Python3] Comprendre les bases des opérations sur les fichiers
traitement (python) Diagramme les coordonnées de la liste Spécifiez le nombre de fois dans draw ()