Concurrent DB Access with Perl
tokuhirom さんのセッション。
これまた大人気のセッションでした。
RDBMS に並行にアクセスしたい。
Webアプリケーションでは、DB へクエリを投げて整形して〜 ということが多い。
何回かクエリを投げる場合、直列の場合は各クエリでブロッキングするのでレスポンスが伸びる。
並列ならそれを短くできる。
つまり、基本的には Socket を ノンブロッキングにしておいて、Readable になるまでまって次々と処理をしていく。
PostgreSQL
並列アクセスがコアにそもそも入っているためカンタンにできる。
use DBD::Pg ':async'; use AE; # AnyEvent $dbh->prepare($SQL, { pg_async => PG_ASYNC}); # async モード
$dbh->pg_socket で読み込み可能になるのを待ち、$stm->pg_ready で準備完了になるのを待つ。
MySQL
libmysqlclent はノンブロッキングをサポートしていない。libdrizzle を使うとノンブロッキングにアクセスできる。
libdrizzle は libmysqlclient より早いらしい?が確認はしていない。
Net::Drizzle
libdrizzle のインタフェースをそのまま書いたので、libdrizzle でできることはほぼできる。