2011-11-17 23 views
8

Mam wyszukiwanie google, ale nie mogłem znaleźć odpowiedzi na to, co myślę, że jest łatwe quest.perl dbi reconnect on disconnect

Mam kod perla (przykład poniżej), który pobiera dane co 3 sekundy i aktualizuje odebrane dane do bazy danych Mysql, ale czasami baza danych mysql nie jest dostępna i skrypt umiera. Jak mogę ponownie utworzyć połączenie mysql, jeśli się nie powiedzie?

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 ;} 
} 

Odpowiedz

7

Można również spojrzeć na tym wątku: http://www.perlmonks.org/?node_id=317168

ten omawia sposób radzenia sobie z „serwer MySQL zniknęło” problem, ale kilka odpowiedzi odnoszą się do problemu zbyt. Możesz skorzystać z zaleceń tam, oprócz przełącznika mysql_auto_reconnect.

+0

Witam, czy możesz wskazać mi pełny przykład użycia Auto_connect? Nadal jestem całkiem nowy w perlu, czy mogę po prostu przekazać atrybut jak poniżej? moi $ connect = DBI-> connect ("DBI: mysql: $ bazy danych: $ host", $ user, $ Pw {raiseError => 1, AUTOCOMMIT => 1, mysql_auto_reconnect => 1} ); – Linus

+0

Tak, to powinno zadziałać. Możesz także ustawić bit po utworzeniu '$ connect', np.' $ Connect -> {mysql_auto_reconnect} = 1'. Jednak przed użyciem tej funkcji należy rozważyć ostrzeżenie określone przez @Ted. Możesz również rzucić okiem na 'DBIx :: Connector' w CPAN, dla' Szybkie, bezpieczne połączenie DBI i zarządzanie transakcjami' – Unos

+0

@ Ted Hopp fantastic .. działa świetnie .. dzięki wszystkim. – Linus

7

DBD::mysql kierowca (DBI, że używa do baz danych MySQL) obsługuje atrybut mysql_auto_reconnect. Aby go włączyć, wystarczy wykonać

$connect->{mysql_auto_reconnect} = 1; 

Zauważ, że docs mają to ostrzeżenie:

Ustawianie mysql_auto_reconnect się na nie jest zalecane, jeśli jest używany 'lock' tabele bo jeśli DBD :: mysql ponownie połączyć mysql wszystkie blokady tabeli zostaną utracone. Ten atrybut jest ignorowany, gdy AutoCommit jest wyłączony, a gdy AutoCommit jest wyłączony, DBD :: mysql nie będzie automatycznie ponownie łączył się z serwerem.

Powiązane problemy