perlとforkとDBI

| コメント(0) | トラックバック(0)

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

#サンプル出力のバージョンが残念なバージョンでした...

トラックバック(0)

トラックバックURL: https://www.jdcn.co.jp/cgi-bin/mt/mt-tb.cgi/73

コメントする

2012年3月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.38
 
 

このブログ記事について

このページは、ゆうちゃんが2011年6月30日 10:05に書いたブログ記事です。

ひとつ前のブログ記事は「php 5.3とSmarty 3」です。

次のブログ記事は「CentOS 5.4以降でのIPv6無効化」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。