2011-11-17 12 views
8

ho la ricerca su google ma non sono riuscito a trovare una risposta a quello che penso sia una facile quiestion.perl dbi riconnettere su disconnessione

Ho un codice perl (esempio sotto) che riceve i dati ogni 3 secondi e aggiorna i dati ricevuti nel database Mysql ma talvolta il database mysql non è disponibile e lo script muore. Come posso rendere nuovamente la connessione mysql se fallisce?

use DBD::Mysql; 

sub updateMysqlDB{ 
my $connect = DBI->connect("dbi:mysql:$database:$host", 
         $user, 
         $pw, 
         {RaiseError => 1} 
         ); 
$myquery = "My sql query to insrt data into columns"; 
$query_handle=$connect->prepare($myquery); 
$query_handle->execute(); 
$connect->disconnect; 
} 

while (1) { 

if data received call updateMysqlDB(); 

else wait for data { sleep 3 ;} 
} 

risposta

7

Si può anche guardare a questa discussione: http://www.perlmonks.org/?node_id=317168

questo discute il modo di trattare con "server MySQL è andato via" problema, ma alcune risposte si applicano al vostro problema troppo. Puoi utilizzare i consigli qui, oltre allo switch mysql_auto_reconnect.

+0

ciao, puoi indicarmi un esempio completo sull'uso di Auto_reconnect? Sono ancora abbastanza nuovo in Perl, posso semplicemente passare l'attributo come di seguito? miei $ collegano = DBI-> connect ("DBI: mysql: $ database: $ host", $ user, $ pw, {RaiseError => 1, AutoCommit => 1, mysql_auto_reconnect => 1} ); – Linus

+0

Sì, dovrebbe funzionare. Puoi anche impostare il bit dopo aver creato '$ connect', come' $ connect -> {mysql_auto_reconnect} = 1'. Tuttavia, è necessario considerare l'avviso specificato da @Ted, prima di utilizzare questa funzione. Puoi anche dare un'occhiata a 'DBIx :: Connector' su CPAN, per' Connessione DBI veloce e sicura e gestione delle transazioni' – Unos

+0

@Ted Hopp fantastico .. funziona alla grande .. grazie a tutti. – Linus

7

Il driver DBD::mysql (che DBI utilizza per i database MySQL) supporta un attributo mysql_auto_reconnect. Per attivarla, basta eseguire

$connect->{mysql_auto_reconnect} = 1; 

Si noti che i documenti hanno questo avvertimento:

Impostazione mysql_auto_reconnect per il non è consigliato se viene utilizzato 'tavoli di blocco', perché se DBD :: mysql riconnessione a mysql tutte le serrature da tavolo andranno perse. Questo attributo viene ignorato quando AutoCommit è disattivato e quando AutoCommit è disattivato, DBD :: mysql non si ricollegherà automaticamente al server.

Problemi correlati