Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-03-29

リクエスト単位でDBのハンドらを保持する方法は?

| 13:53 |  リクエスト単位でDBのハンドらを保持する方法は? - dann@catalyst を含むブックマーク はてなブックマーク -  リクエスト単位でDBのハンドらを保持する方法は? - dann@catalyst  リクエスト単位でDBのハンドらを保持する方法は? - dann@catalyst のブックマークコメント

connect_info([ sub { DBI->connect(...) } ]);

DBIx::Class::Storage::DBIの_connectメソッド。connect_infoの一番目の引数がコードレファレンスの場合にはそれが実行されるみたいだから、ここでdbhの返しかたを変えれば、リクエスト単位、プロセス単位の切り替えはできるんじゃないかと思った。

sub _connect {
  (snip)
  eval {
    if(ref $info[0] eq 'CODE') {
       $dbh = &{$info[0]}
    }
    else {
       $dbh = DBI->connect(@info);
    }

以下のような感じで書けるってことらしい。connect_infoに渡すcode_ref中に、mod_perlだったらApacheのpnotesから取得するとかいうコードを書いとけばいいのかな。プロセス単位で保持する場合でもここでよさそう。

  # Connect via subref
  ->connect_info([ sub { DBI->connect(...) } ]);

  # Subref + DBIC-specific connection options
  ->connect_info(
    [
      sub { DBI->connect(...) },
      {
          quote_char => q{`},
          name_sep => q{@},
          on_connect_do => ['SET search_path TO myschema,otherschema,public'],
          disable_sth_caching => 1,
      },
    ]
  );

storageを設定するところのコードを後で読んでおけば、これで大体いけるんじゃないかなぁ。TODOリストに積む。

vkgtarovkgtaro2008/03/30 22:05おつでしたー。
そしてお邪魔しましたー。
奥様にもよろしくお伝えください。

danndann2008/03/30 23:57
おつでしたー。また遊びにきてくださーい。では。

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080329