InactiveDestroyのアホな使い方

| コメント(0) | トラックバック(0)
WebAppで DBIをなんらかの方法でDBに接続して、で、リクエストが終わったら接続を解除して・・・とかしたいとするじゃないですか。具体的な実装はScope::Containerでもなんでもいいんですけど。

それでなんかしらんけど、アクセスするたびに三つずつDB接続が残る、という現象に遭遇したわけですよ。最初は普通に「あれ、Scope::Containerの使い方間違ってたか」とか思ってたんですが、何をしてもダメだし、Scope::Containerに手を加えて現在の保持してる変数を抜き出しても何もない。DBI::db へのリファレンスがないのに接続が切れないなんて・・・と途方に暮れることと数時間。

・・・やっちまったよ。ワーカーも同じ設定使うからーってのと、ワーカーはフォークするからーとか考えて適当に入れた次の設定がまずかった

     InactiveDestroy => 1

これ、つまりは$dbhをundefしようがなんだろうが、DBサーバーとの接続が切れないってことなんだね。普通は親プロセスがconnectして、forkした子プロセスがexitしちゃった時についでに$dbhが保持してる接続を解放しないように**子プロセス**で設定するものなんだけど、親でこれを設定してしまうと、永遠にDBへの接続が切れません・・・

なんてこたぁない、俺のやりたかったのは、こちらでした

    AutoInactiveDestory => 1
こっちは、「もし子プロセスを作るなら、自動的にInactiveDestroyを有効にした状態にしろ」っていうことなので、親プロセスは通常通りにundef $dbhで接続が切れる。

あー、あほくさかった。おれの午後を返せ。よい子のみんなは真似しちゃダメだぞ!

Author

Daisuke Maki (a.k.a lestrrat): Perl hacker, Director of Japan Perl Association, YAPC::Asia Tokyo Organizer (2009-2012), Fluent in Japanese, English. Ex-Brazilian (sorta)

#perl #c #ruby #java #mysql #english #japanese #opensource #stf #cooking #scotch #cigar


このエントリーをはてなブックマ
ークに追加

翔泳社よりモダンPerl入門(2010)を出版させていただいております。できれば内容をアップデートしたいので是非皆様・・・現在の在庫処理にお力をお貸しください!><

月別アーカイブ