2011-11-17 35 views
8

私は検索グーグルがありますが、私は簡単な憶測であると思う答えを見つけることができませんでした。perl dbi再接続時に再接続

3秒ごとにデータを取得し、受信したデータをMysqlデータベースに更新するperlコード(下記の例)がありますが、mysqlデータベースが利用できず、スクリプトが停止することがあります。失敗した場合、どうすればmysql接続を再作成できますか?

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

答えて

7

また、このスレッドを見ることができます:http://www.perlmonks.org/?node_id=317168

これは、「MySQLサーバが離れて行ってしまった」問題に対処する方法を説明しますが、いくつかの答えは、あまりにもあなたの問題に適用されます。 mysql_auto_reconnectスイッチに加えて、そこの推奨事項を使用することができます。

+0

こんにちは、Auto_reconnectの使い方の完全な例を教えてください。私はまだPerlで新しいです、私はちょうど下のような属性を渡すことができますか? 私$接続= DBI->接続( "DBI:MySQLの:$データベース:$ホスト"、 $ユーザ、 $ PW、 {RAISEERROR => 1、 自動コミット=> 1、 mysql_auto_reconnect => 1} ); – Linus

+0

はい、うまくいくはずです。 '$ connect - > {mysql_auto_reconnect} = 1'のように' $ connect'を作成した後にビットを設定することもできます。ただし、この機能を使用する前に@Tedで指定された警告を考慮する必要があります。また、CPANの 'DBIx :: Connector'を'高速で安全なDBI接続とトランザクション管理 'のために見ることができます – Unos

+0

@Ted Hopp fantastic ..すごくうれしく思います。 – Linus

7

DBD::mysqlドライバは(DBIは、MySQLデータベースに使用する)属性mysql_auto_reconnectをサポートしています。ちょうどドキュメントはこの警告持っていることを

$connect->{mysql_auto_reconnect} = 1; 

注意を実行し、それをオンにするには:「ロックテーブルは」なぜならた場合に使用されている場合mysql_auto_reconnectを設定

が上の助言されていないためにはDBD :: mysqlの再接続にmysqlのすべてのテーブルロックは失われます。 AutoCommitがオフになっているときにこの属性は無視され、AutoCommitがオフになっていると、DBD :: mysqlは自動的にサーバーに再接続しません。