Threads et MySQL comment passer un argument.
Salut à tous ! Désolé d'avance si ma question est triviale. Je vous explique en gros le problème. J'aimerais lancer X threads qui réalise une connection telnet chacun sur un élément, récupère des infos et les place dans une base de données.
J'ai bien essayé de créer une connection à la base de données dans chaque thread mais après Y threads il y a trop de connexion et tout foire. J'aimerais donc créer la connexion dans le main et passer la structure de la connexion mysql dans chaque thread pour ne faire qu'une seule connexion. Cependant j'ai un sale message d'erreur.
En fait j'ai ceci comme message d'erreur :
Citation:
Thread 1 terminated abnormally: DBD::mysql::db prepare failed: handle 2 is owned by thread 81dd008 not current thread 878e518 (handles can't be shared between threads and your driver may need a CLONE method added) at /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/Mysql.pm line 161, <LOGTEL> line 29.
Auriez-vous une idée de comment règler le problème ? Je vous remercie d'avance pour toute aide.
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
#Thread qui sera créé.
sub thr_sw {
my @Parametres = @_;
#$dbh_tel = $Parametres[0];
$ip = $Parametres[0];
$nom_switch= $Parametres[1];
my $dbh_tel_cp = $Parametres[2];
... tout le code de traitement (ce n'est pas plus qui pose problème).
... et ensuite les requêtes mysql pour ajouter des infos à la BD
$stmt = "replace into `telephones` (`MAC`,`NUM_TEL`,`NOM`,`IP_TEL`,`ETAT`,`SWITCH`,`INTERFACE`,`DATE_MAJ`) values ('$mac','$numero','$nom_user','$iptel','$state','$nom_switch','$interf','$now');";
$sth_tel = $dbh_tel_cp->query($stmt);
}
#main qui appelle le thread : on a créé avant la connexion à la BD
#Connexion à la base de donnée téléphonies (une seule connexion donc une seule structure).
$host="localhost";
$database="telephonie";
$user="xxxx";
$password="yyyy";
my $dbh_tel = Mysql->connect($host, $database, $user, $password);
#on crée tous les threads en voulant leur passer l'objet mysql
for(my $ii=0; $ii<$nblines; $ii++) {
$xx = 1;
@arr = $sth->fetchrow;
$ip = $arr[0];
$nom_switch = $arr[1];
#my $dbh_tel_copy = clone($dbh_tel); -----------------------> J'ai tenté le clone ... mais ça va pas
$thr[$i] = threads->new(\&thr_sw, $ip,$nom_switch,$dbh_tel); #je veux passer la structure de connexion mysql
}
#Attente que tous les threads se finissent correctement.
for(my $ii=0; $ii<$nblines; $ii++) {
$thr[$i]->join;
} |