Hatena::Groupcatalyst

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

2008-04-15

コネクションが切れた場合の再接続

23:33 | コネクションが切れた場合の再接続 - dann@catalyst を含むブックマーク はてなブックマーク - コネクションが切れた場合の再接続 - dann@catalyst コネクションが切れた場合の再接続 - dann@catalyst のブックマークコメント

ありがたいことにブクマコメントで幾つかヒントをもらったので、少し考えてみました。

id:naoyaさんから、「DBIのconnect_cached」

id:kazeburoさんから、「mysqlのreconnectの機能」

DBIx::Class::Storage::DBIにも

connect_cachedのコードでは、以下のようなチェックをして、それ以外の場合に$dbhを作り直すという処理になっていました。

if ($dbh && $dbh->FETCH('Active') && eval { $dbh->ping }) {

mod_perl+connect_cachedでは、プロセスレベルでコネクションが保持されるようになるので、コネクションは張りっぱなしになるのでDBサーバーに負荷はかかるかもしれませんが、十分にDBサーバーに余裕があれば、connect_cachedでよいのかなぁという気がしました。

最終的にはコネクションが張りっぱなしにならないようにしてDBサーバーの負荷を下げるために、リクエスト単位でコネクションを取得する形になるのかなぁという気もしてますが、これも後々調べようかなぁと思ってます。

キャッシングの機構

22:56 | キャッシングの機構 - dann@catalyst を含むブックマーク はてなブックマーク - キャッシングの機構 - dann@catalyst キャッシングの機構 - dann@catalyst のブックマークコメント

Catalyst+DBIx::Classでしばらく遊んでいこうかなぁと思っています。

ただ、分散構成にしてMemcachedでのキャッシングまでを考えた場合、DBIx::Classだとキャッシング周りの機構がかなり厳しいかなぁという印象がありますが、折角初めてさわるPerlのORマッパなのでしばらく遊ぼうかなぁと思っています。

キャッシングだけを見ると、Data::ObjectDriverのほうが相当よく考えられているなぁという感じです。fallbackの仕組みが綺麗に考えられていて、キャッシングの仕組みを実装するときには参考になります。ORマッパとキャッシングの機構というのは切っても切り離せない関係にあるのだなぁという気がしました。

DBIC内でのキャッシュの難しさ

18:26 |  DBIC内でのキャッシュの難しさ - dann@catalyst を含むブックマーク はてなブックマーク -  DBIC内でのキャッシュの難しさ - dann@catalyst  DBIC内でのキャッシュの難しさ - dann@catalyst のブックマークコメント

dbic内でキャッシュするときに難しいのは2点あって、

  • Relationがある場合にその関連先のデータをキャッシュできない
  • 最終的に到達するのが、DBIx::Classs::Storage::DBIで、そこではid引っ張るのが大変

DBICの外側でキャッシングしようとしても、Relationがなければキャッシュしてもいけますが、Relationがあるとキャッシュ時にResultSourceの情報が落ちてしまって、キャッシュができないからなんじゃないかなぁと。

has_oneとかのあるRelationがあるデータをキャッシングするときってどうすればいいのかがよくわからなくて、どうすればキャッシングできるのかわからないなぁという感じです。

DBICの外側でも内側でも、簡単にキャッシングできる方法があればなぁと思っているのですが。

自分が理解してないだけなのかはよくわからないけど、うまくキャッシングできる気がしない。逆にRelationはってなければ、普通にキャッシュできると思うんだけれど。

# Data::ObjectDriverのコードを見ても、has_aのキャッシュはexperimentalとなってますが...

# id:typesterさんにDBIx::Class::Cursor::Cachedを教えてもらった!前に試してみた気もするけど記憶がない... ということで、まじめに後で試す!

http://search.cpan.org/~mstrout/DBIx-Class-Cursor-Cached-1.0.1/lib/DBIx/Class/Cursor/Cached.pm

$rs->cursor->clear_cacheと書かなきゃ行けないのは何とかしたいから後で調べる。

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