2007年4月5日木曜日

Perl O/Rラッパー使用のトレードオフ

データベースアクセスするコードを少し前に書いたのだけど、
DBとのインターフェースに何を使うか迷った。

ビジネスとかで製造するアプリとかだと、
O/Rラッパー(Class::DBI,DBIx::Classとか)や、自作のかっこいいのを使うのだろうけど、
レンタルサーバーで個人で小さいもの作る場合には微妙。

理由みたいなものとして
DBのテーブル数個、SQLは10本ちょいとかなのに、
レンタルサーバーにO/Rラッパーを導入するのは面倒くさい。
Class::DBIとかは、依存するパッケージが多いらしい(確認したことがない。)

結論として、
DBアクセスは、自作のアクセッサーを使うことにした。
二昔ぐらいにありがちな、Selectして、結果をハッシュで返すアクセッサーw
use strict;
use warnings;
use Carp;
my $conn = undef;
sub new { my $class = shift; $conn =
shift; my $self = {}; return bless $self;}
sub
set_connection { my $self = shift; $conn =
shift;}
sub get_connection { return $conn;}
sub get_statement { ゴニョゴニュキャッシュを行う。}
sub select {
my ( $self, $sql, @params ) = @_;

my $sta = get_statment($sql);
if ( @params && length @params > 0 ) {
$sta->execute(@params) or
Carp::croak($!);
} else {
$sta->execute() or Carp::croak($!);
}
my @vos;
while ( my $obj = $sta->fetchrow_hashref() ) {
my $a = bless $obj,"DB::VO";
push @vos, $a;
}
$sta->finish();
return @vos;
}

簡単に書くとこんな感じです。
connectionは、このモジュール外で作成して、作成したところでトランザクションの管理をします。
get_statmentとかは、statementのキャッシュをしてる感じです。
(statementの生成コストは高い!)

これにDAO(DataAccessObject)を作って、そこからバンバンSQLを投げ込む。
DAOにSQLは直接書き込む。

色々な意見があると思うけど、二人で作ってる小さなものに、O/Rラッパーは不要?
O/Rラッパーの設定している間に、DB周りのコーディングも終わってしまうし、よっぽど生産性も高い。
メンテナンスも、人に頼むわけじゃないので十分。
端的すぎるかもしれないけど、使うモジュールも少ないので、性能も少しは上がるはず。

0 件のコメント: