У меня проблема, когда я использую Apache :: DBI в дочерних процессах. Проблема заключается в том, что Apache :: DBI обеспечивает единый дескриптор для всех процессов, которые используют его, так что я получаюЧто такое безопасный способ использования fork с Apache :: DBI в mod_perl2?
DBD :: MySQL :: дб selectall_arrayref не удалось: команды из синхронизации; Вы не можете запустить эту команду теперь в /usr/local/www/apache22/data/test-fork.cgi линии 20.
Reconnection не помогает, так как Apache :: DBI воссоединяется в все процессы, как я понял следующее сообщение об ошибке
сервер обнаружил внутреннюю ошибку и не смог завершить свой запрос.
Сообщение об ошибке: драйвер DBD не имеет реализован AutoCommit атрибут в /usr/local/lib/perl5/site_perl/5.8.9/Apache/DBI.pm линии 283.,
Вот код происхождения:
use Data::Dumper 'Dumper';
use DBI();
my $dbh = DBI->connect($dsn, $username, $password, {
RaiseError => 1,
PrintError => 0,
});
my $file = "/tmp/test-fork.tmp";
my $pid = fork;
defined $pid or die "fork: $!";
if ($pid) {
my $rows = eval { $dbh->selectall_arrayref('SELECT SLEEP(1)') };
print "Content-Type: text/plain\n\n";
print $rows ? "parent: " . Dumper($rows) : [email protected];
}
else {
my $rows = eval { $dbh->selectall_arrayref('SELECT SLEEP(1)') };
open FH, '>', $file or die "$file: $!";
print FH $rows ? "child: " . Dumper($rows) : [email protected];
close FH;
}
код я использовал для повторного соединения:
...
else {
$dbh->disconnect;
$dbh = DBI->connect($dsn, $username, $password, $attrs);
my $rows = eval { $dbh->selectall_arrayref('SELECT SLEEP(1)') };
open FH, '>', $file or die "$file: $!";
print FH $rows ? "child: " . Dumper($rows) : [email protected];
close FH;
}
Есть ли безопасный способ использования Apache :: DBI с forking? Есть ли способ заставить его создать новое соединение, возможно?
Ваш первый вариант не подходит для меня. Ты это пробовал? – codeholic
@codeholic: что вы подразумеваете под этим не работает? Вам придется снова вызвать '$ dbh = DBI-> connect (...)', так как $ dbh теперь не определено. – Ether
@codeholic: ладно, я думаю, что все в моем ответе - это красная селедка - похоже, у вас что-то еще происходит. то есть «что-то» передает атрибут AutoCommit ненадлежащим образом. Является ли эта проблема чем-то новым, что только что началось, или у вас всегда было это? Я подозреваю, что в ваших конфигах происходит что-то странное. – Ether