perlでDBIを使った処理でforkさせた際に、ちょっとはまったので、忘れないように書いておく。
親プロセスで、DB接続後にforkする場合、子プロセスにデーターベースハンドルが引き継がれて
しまい、困った事象(親のDB接続が切れる)が発生する。
これを回避するには、親プロセスのDB接続時に「AutoInactiveDestroy => 1」を設定すると、
幸せになれる。
○ソース例
my $conn = DBI->connect($dbname, $dbuser, $dbpass,
{AutoCommit=>1, PrintError=>0, RaiseError=>0,AutoInactiveDestroy=>1}) ||
die "OPEN ERROR(1): " . $DBI::errstr;
# fork
my $pid = fork;
if (!defined $pid) {
die "fork failed"; # 生成に失敗した
} elsif (!$pid) {
# 子プロセス本体
# 子プロセス用DB open
my $conncd = DBI->connect($dbname, $dbuser, $dbpass,
{AutoCommit=>1, PrintError=>0, RaiseError=>0}) ||
die "OPEN ERROR(2): " . $DBI::errstr;
# 子プロセス処理
# 子プロセス用DB close
$conncd->disconnect();
exit;
}
# 親DB切断
$conn->disconnect();
|
ただし、"AutoInactiveDestroy"が使えるのは、DBIのバージョンが1.6.14以降の場合のみ。
それ以前の場合は、子プロセススタート時に、「$conn->{InactiveDestroy} = 1」とするとよい。
ちなみに、perlモジュールのバージョン確認は、Module::Infoをインストールしておくと、
簡単に確認できる。
$ module_info DBI
Name: DBI
Version: 1.52
Directory: /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi
File: /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/DBI.pm
Core module: no
|
#サンプル出力のバージョンが残念なバージョンでした...
コメントする