はちゅにっき

こっちのブログはまったり更新

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 でできることはほぼできる。

SQLite の非同期アクセス

非同期化パッチが公開されている。
が、SQLite 本体側ではまだサポートしていない。