2011-11-17 51 views
8

tôi có tìm kiếm google nhưng không thể tìm thấy câu trả lời cho những gì tôi nghĩ là một quiestion dễ dàng.perl dbi kết nối lại trên ngắt kết nối

Tôi có mã perl (ví dụ bên dưới) nhận dữ liệu 3 giây một lần và cập nhật dữ liệu nhận được vào cơ sở dữ liệu Mysql nhưng đôi khi cơ sở dữ liệu mysql không có sẵn và tập lệnh chết. Làm thế nào tôi có thể làm cho kết nối mysql một lần nữa nếu nó không thành công?

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

Trả lời

7

Bạn cũng có thể xem chủ đề này: http://www.perlmonks.org/?node_id=317168

này thảo luận về cách thức để đối phó với "máy chủ MySQL đã ra đi" vấn đề, nhưng một vài câu trả lời áp dụng cho vấn đề của bạn quá. Bạn có thể sử dụng các đề xuất ở đó, ngoài công tắc mysql_auto_reconnect.

+0

xin chào, bạn có thể vui lòng chỉ cho tôi một ví dụ đầy đủ về cách sử dụng Auto_reconnect không? Tôi vẫn còn khá mới ở perl, tôi chỉ có thể vượt qua các thuộc tính như dưới đây? $ của tôi kết nối = DBI-> connect ("dBi: mysql: $ cơ sở dữ liệu: $ host", $ user, $ pw, {RaiseError => 1, Autocommit => 1, mysql_auto_reconnect => 1} ); – Linus

+0

Có, điều đó sẽ hoạt động. Bạn cũng có thể thiết lập bit sau khi tạo '$ connect', như' $ connect -> {mysql_auto_reconnect} = 1'. Tuy nhiên, bạn cần xem xét cảnh báo được chỉ định bởi @Ted, trước khi sử dụng tính năng này. Bạn cũng có thể xem xét 'DBIx :: Connector' tại CPAN, cho kết nối DBI nhanh và an toàn và quản lý giao dịch' – Unos

+0

@Ted Hopp fantastic .. hoạt động tuyệt vời .. cảm ơn tất cả mọi người. – Linus

7

Trình điều khiển DBD::mysql (DBI sử dụng cho cơ sở dữ liệu MySQL) hỗ trợ thuộc tính mysql_auto_reconnect. Để bật tính năng này, chỉ cần thực hiện

$connect->{mysql_auto_reconnect} = 1; 

Lưu ý rằng các tài liệu có cảnh báo này:

Thiết mysql_auto_reconnect để trên không được khuyến cáo nếu 'bảng khóa' được sử dụng bởi vì nếu DBD :: mysql kết nối lại để mysql tất cả các khóa bảng sẽ bị mất. Thuộc tính này được bỏ qua khi AutoCommit bị tắt và khi AutoCommit bị tắt, DBD :: mysql sẽ không tự động kết nối lại với máy chủ.

Các vấn đề liên quan