2009-07-28 27 views
5

Tôi đã thử với trình quản lý ngã ba Perl và DBI. Nhưng tôi đã nhận được lỗi DBD :: mysql :: st thực thi không thành công: Mất kết nối với máy chủ MySQL trong khi truy vấn.Tại sao tôi không thể truy vấn cơ sở dữ liệu từ một đứa trẻ bị chia rẽ trong Perl?

Đây mã mẫu: Tôi muốn làm cho truy vấn giữa thấp đến giá trị cao (tôi đã phun nước bọt hồ sơ int 10k)

use Parallel::ForkManager; 
my $pm = new Parallel::ForkManager(50); 
my $db = krish::DB->new or die $!; # its has all connection details 
while ($low < $high ) { 
    # Some value manipulation 

    my $pid = $pm->start and next; 
    #db_execution returns execution 
    while (my $sth = db_execution ($db, $low , $high)) { 
     ... 
     #fetch row operation 
     ... 
    } 
    $pm->finish; 
} 

sub db_execution { 
    ... 
    my $dbh = $db->connect('students') or die $!; 
    my $sth = $dbh->prepare($sql) or die "$!:" . $dbh->errstr; 
    $sth->execute or die "$!:" . $sth->errstr; 
    ... 
} 

Cùng mã được thực hiện với xử lý song song ra. Vấn đề là gì? Làm cách nào để giải quyết vấn đề này?

+0

Xin lỗi mọi người. Tôi đã nhầm lẫn chuyển đổi thành cộng đồng wiki – joe

Trả lời

9

Khi bạn chia sẻ kết nối cơ sở dữ liệu giữa các quá trình (đó là những gì bạn đang làm với một ngã ba), bạn cần phải chắc chắn rằng một quá trình không đóng nó ra từ dưới một trong những khác. Bởi vì các kết nối cũng là các biến, khi trình thông dịch Perl tắt nó sẽ gọi phương thức DESTROY của đối tượng đó trong trường hợp này sẽ đóng kết nối.

Vì vậy, nếu bất kỳ trẻ nào đóng kết nối db (điều này sẽ xảy ra khi chúng kết thúc và tắt máy), nó sẽ loại bỏ nó ra khỏi quá trình cha mẹ. Cách để ngăn chặn điều này là đặt InactiveDestroy thành true trong quá trình cha mẹ trước ngã ba và sau đó đóng kết nối một cách rõ ràng trong phụ huynh khi hoàn tất.

https://metacpan.org/pod/DBI#InactiveDestroy

+3

Một cách khác để làm điều đó là chỉ cần mở kết nối cơ sở dữ liệu sau khi bạn 'fork()'. Bằng cách đó, mỗi đứa trẻ đều có kết nối riêng và chúng không thể can thiệp lẫn nhau. Việc chia sẻ một kết nối duy nhất giữa nhiều quy trình thường không phải là một ý tưởng hay. –

+1

Vâng, cũng vậy. Đặc biệt là vì một số hệ thống (như Oracle) không hỗ trợ chia sẻ kết nối giữa các quá trình. – mpeters

0

Bạn đang yêu cầu cho các rắc rối bằng cách sử dụng tay cầm cùng db đồng thời trong tất cả các tiến trình con. Bạn nên tạo một kết nối mới trong mỗi đứa trẻ.

Đừng bận tâm ... Tôi đã đọc phần còn lại của mã.

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