Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] [Résolu] Effect de bord de jDb:disconnect()

Posted by yan_vn on 05/09/2015 11:43

Bonjour à tous,

Je suis tombé sur un comportement "inattendu" de la nouvelle fonction de Jelix 1.6 jDb:disconnect(). Comme la fonction ne semble pas explicitement documentée, je n'ouvre pas de bogue car c'est peut-être un comportement "normal".

Pour un script d'envoi d'e-mails à des groupes d'utilisateurs, j'ai deux boucles imbriqués qui scan trois tables via deux connexions jDb et une jDao, j'ai besoin de plusieurs connexions car les tables sont sur des bases différentes.

Auparavant, je faisais un unique pg_close() à la fin de la boucle. J'ai essayé de remplacer cette fonction par des disconnect() explicites :

$les_bdd = array ('costa1','costa2','costa3','costa4');
for ($db = 1; $db <=4; $db++) {
	$dbcnx = jDb::getConnection($les_bdd[$db-1]);
	$liste_users = $dbcnx->query($sql);
	if (count($liste_users)>0) foreach ($liste_users as $un_user) {
		$liste_logs = $dbcnx->query($sql);
		$dbcnx_logs = jDb::getConnection();	// Les logs internes sont sur la BDD1
		if (count($liste_logs)>0) foreach ($liste_logs as $un_log) {
			$liste_queries = $dbcnx_logs->query($sql);
		}
		if (isset($dbcnx_logs)) $dbcnx_logs->disconnect();
	}
	if (isset($dbcnx)) $dbcnx->disconnect();
}

Le problème c'est que le premier $dbcnx_logs->disconnect() ferme aussi la connexion $dbcnx. Toutes deux utilisent le même pilote jDb.

Cordialement, Yannick DEVOS.


Yannick DEVOS - http://www.nature-mekong.com/

  [Opened] Effect de bord de jDb:disconnect()

Reply #1 Posted by laurentj on 05/11/2015 13:51

Bonjour,

si $dbcnx_logs->disconnect() ferme aussi la connexion $dbcnx, cela veut dire qu'il s'agit de la même connexion, du même profil. Le disconnect pour le driver pgsql fait un simple pg_close() sur l'identifiant de connexion.

De plus, je ne vois pas l’intérêt de fermer la connection dbcnx_logs à l’intérieur de la boucle, si c'est pour la ré-ouvrir à l'itération suivante. Peut-être confond tu avec la fermeture du resultset...

  [Opened] Re: Effect de bord de jDb:disconnect()

Reply #2 Posted by yan_vn on 05/12/2015 03:13

Bonjour Laurent,

Merci de ta réponse. J'avais mal "recopié" mon code, c'est un connect() que je fais au début de la boucle et non un query(). J'ai changé mon extrait de code pour être plus proche de la réalité mais le code fait 150 lignes avec beaucoup de tests, donc je ne peux pas le mettre tel-quel.

Je vais aussi refaire des tests. Peut-être qu'effectivement l'erreur est levée dans le cas où la base de données est la même pour les deux connexions. Cela arrive une fois sur 4, lors de la première itération de la première boucle. J'avais perdu de vue que dans ce cas la connexion précédente sera réutilisée.

Je te tiens au courant.

Yannick.


Yannick DEVOS - http://www.nature-mekong.com/

  [Opened] Effect de bord de jDb:disconnect()

Reply #3 Posted by yan_vn on 05/12/2015 04:20

Bon, ça ne marche pas. Si je fais un pg_close() ou un unset($dbcnx) ça passe, mais si je fais un $dbcnx->disconnect() il refuse de me rouvrir une connexion lors de l'itération suivante et le script plante.

Par principe j'aime bien ferme les connexions dans les boucles mais là je crois que je vais laisser le pg_close et risquer d'avoir des connexions ouvertes. Au pire ça ne fait que 4 connexions sur la BDD pendant 1 minutes à une heure creuse, pas de quoi écrouler le serveur.

Je retourne dans mon trou, désolé d'avoir fait du bruit pour rien... Yan.


Yannick DEVOS - http://www.nature-mekong.com/

 
Page
  1. Effect de bord de jDb:disconnect()