読者です 読者をやめる 読者になる 読者になる

北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

DBIとforkとInactiveDestroy

@lestrratさんが教えてくれたことのメモ。

以下のコードはエラーとなります*1

use strict;
use warnings;
use DBI;

my $dbh = DBI->connect('DBI:mysql:mysql', 'root', 'password') or die DBI->errstr;

my $pid;
if ($pid = fork) {
	# NOP in the parent
	waitpid $pid => 0;
} elsif (defined $pid) {
	# NOP in the child
	exit;
} else {
	die "Couldn't fork, stopped";
}

print $dbh->selectrow_array('select count(*) from user'), "\n";

【実行結果】
DBD::mysql::db selectrow_array failed: MySQL server has gone away at xxxx.pl line 18.

InactiveDestroyをちゃんと設定してないだけとか?

@lestrrat

仰せの通りでした。。。去年秋以降くらいの新しいDBIを使ってるなら、接続後に $dbh->{AutoInactiveDestroy} = 1 しとけばOKです。古いDBIなら、fork直後に子プロセス側で $dbh->{InactiveDestroy} = 1 にするといいです。podにも書いてます。

*1:こちらのエントリと同じ内容。