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.
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
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
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
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
Pour MySQL, exécutez show processlist \ g
toutes les secondes pour voir s'il est connecté à la base de données.
Le processus de fermeture con.executable.xxxx ()
exécute une fonction SQL Alchemy.
N'exécutez pas close.
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
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é. ..
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.
show processlist \ g
correspond aux première et 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.
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
.
** C'est peut-être la bonne réponse. .. ** **
con.close()
Non déconnecté.
con.executable.closed : False
con.executable.invalidated: False
con.engine.pool.status() :Je ne peux pas courir
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'
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.
con.close()
con.executable.engine.dispose()
Non déconnecté.
con.executable.closed : False
con.executable.invalidated: False
con.engine.pool.status() :Je ne peux pas courir
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'
La condition ne change pas de la condition 1.
con.executable.close()
Non déconnecté.
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
↓ apparaît et ne peut pas être exécuté.
(sqlalchemy.exc.ResourceClosedError) This Connection is closed
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é.
con.executable.close()
con.executable.engine.dispose()
Soyez déconnecté.
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
↓ apparaît et ne peut pas être exécuté.
(sqlalchemy.exc.ResourceClosedError) This Connection is closed
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.
con.executable.invalidate()
Soyez déconnecté.
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
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
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.
Connexions dans le pool: 1
.con.executable.invalidate()
con.executable.engine.dispose()
Soyez déconnecté.
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
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
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