Catalyst+Jifty::DBIの組み合わせを試してみる

こんにちは、Perl担当の西山です。
PerlにはたくさんのDBアクセス用のモジュールが用意されていますが、
皆さんはどのDBアクセスを使用していますか?
最近ではDBIx::Class(通称DBIC)がデファクトと呼ばれていますね。
ある程度長くPerlを使っている人だとClass::DBI(通称CDBI)に手馴れていて
今でも使っているケースもあると思います。
あとはSix Apartの社内標準モジュールとして開発・公開されている
Data::ObjectDriverもありますね。
Jifty::DBIとは
数あるDBモジュールの中でも個人的に気になっているモジュールがありまして、 それがJifty::DBIです。 DSLを駆使しててかっこいい、独創的、奇抜、変態、などなどと賞賛されているWebアプリケーションフレームワーク「Jifty」と セットで開発されているDBアクセスモジュールです。 一月ほど前に開催されたShibuya.pmでもプレゼンが行われたので気になっている方も多いと思います。 公開されている資料で分かりやすく使い方がまとめられている通り、 DML(データ操作)の手続きの抽象化だけでなくDDL(データ定義)の手続きの抽象化までカバーされていて、 Perl内の競合であるDBICなどよりかはRuby(on Rails)のAction Recordに近い設計思想で Jiftyファミリーのモジュールの中では比較的使いやすいモジュールだと思います。 というわけで、Jiftyごと実際にサービスで使うのはちょっと自信が無かったので、 Jifty::DBIだけでもと思い、個人的に使い慣れているCatalystと組み合わせて使ってみました。導入手順
※追記: charsbarさんがCatalyst::Model::Jifty::DBIモジュールを バージョンアップしてくださっています。Catalyst::Model::Jifty::DBI 0.03 複数データベースでのパーティショニングなど新しい機能にも対応しているようです。 詳しくは上記ページかPODをご参照ください。
Catalystまでセットアップされていれば、Jifty::DBIを導入するのは簡単です。
※MyAppというアプリケーションを作成した状態から始めます。
- CPANからJifty::DBIとCatalyst::Model::Jifty::DBIをインストール。
- ヘルパークラスを使って次のコマンドを実行し、Jifty::DBIのModelクラスを作成する。script/myapp_create.pl model JDBI Jifty::DBI MyApp::Model driver [ドライバー名] database [DB名] host [ホスト名] user [DBユーザ名] password [パスワード]
- MyApp::Model配下にJifty::DBIのスキーマクラスを作成する。詳細はPODを参照。
- "Foo.pm"というスキーマを定義した場合、my $foo = $c->model('JDBI::Foo')という形でCatalystのControllerから呼び出す。
実際に使ってみて分かること
この構成でしばらく運用してみたところちょっと問題が発生。 DBへのコネクションがぶちぶち切れてしまって、どうも切れた際に再接続をしてくれてない様子なのです。 Jifty::DBIのPODを一通り読んでみてもDBICのensure_connectedメソッドにあたるような 接続状態を確認して再接続してくれるメソッドが見当たらなかったので、 以下のようにCatalyst::Model::Jifty::DBIにパッチを当ててしのぎました。
*** 47,52 ****
--- 47,58 ----
my $composed_class = $self->config->{schema}.'::'.$class;
$composed_class->require || croak "Could not load $composed_class: $@";
+ if (!$self->handle->dbh || !$self->handle->dbh->ping) {
+ warn "Reconnect to Database.";
+ $self->handle(Jifty::DBI::Handle->new());
+ $self->handle->connect( %{ $self->config->{connect_info} } );
+ }
+
return $composed_class->new(handle=>$self->handle);
}
Jifty::DBI::HandleがPerlのベーシックなDBアクセスモジュールであるDBIモジュールを継承して
いるので、DBIのメソッドであるpingメソッドを直接呼び出すことで接続状態を確認するようにしました。
まとめ
シビアな場所で実戦投入するにはまだまだ運用実績が足りないのかなーなんて雰囲気は感じられたりもしますが、 API自体はDBICと比べても使いやすいものだと思います。新しいモジュールをじっくり使ってあげて実績を積み上げてあげるのも楽しいですよね。
[2007/11/20 導入手順追記しました]




最近のコメント