DBIラッパー

package DBIH
use strict;
use DBI;

sub dbh {
	$__PACKAGE__::dbh ||= DBI->connect(hoge);
	return $__PACKAGE__::dbh
}

sub prepare {
	my ( $invocant, @sql ) = @_;
	my $dbh = $invocant->dbh;
	map { $__PACKAGE__::sql2sth{$sql} ||= $dbh->prepare($sql) } @sql;
	return wantarray ? 	@__PACKAGE__::sql2sth{@sql} : $__PACKAGE__::sql2sth{$sql[0]};
}

END {
	my @sql = keys %__PACKAGE__::sql2sth;
	map { $__PACKAGE__::sql2sth{$_}->finish } @sql;
	$__PACKAGE__::dbh->disconnect;
}

package名は自由に変更してください。
データベースの種類やパスワードとかはdbhルーチンの中にハードコーディング。
使い方は、下記の通り。

my $sth = DBIH->prepare("SELECT hoge FROM fuga");

要するに、同じSQL文を何度与えても、同じステートメントハンドルが戻ってくる。(ので若干効率化できる)
終了時に全てのステートメントハンドルを解放し、最後にデータベースハンドルも解放する。