- 论坛徽章:
- 1
|
本帖最后由 iakuf 于 2013-10-19 09:47 编辑
回复 1# py
这个模块有个最大的问题,就是同时一个连接上只能一个异步.因为 "DBD::mysql support only single asynchronous query per MySQL connection". 所以生产环境要一定是有多个数据库查询同时的异步, 这个并不能和我们理解的工作方式一样.
例如下面,我们在 SQL 语句中 SLEEP 5 秒,看看查询的速度:
- use EV;
- use 5.010;
- use Smart::Comments;
- use AnyEvent::DBI::MySQL;
- my $dbh = AnyEvent::DBI::MySQL->connect('dbi:mysql:database=test', 'user', 'pass');
- for ( 1 .. 10 ) {
- $dbh->selectall_arrayref(
- "select SLEEP(5), 3",
- sub {
- my ($ary_ref) = @_;
- ### $ary_ref
- }
- );
- }
- EV::run;
复制代码 这样工作是会出问题的.
必须使用下面这种方式,但下面这种方式太浪费连接了,大多的查询很快,大多的开销都在创建连接和断开.
- #!/usr/bin/perl
- use EV;
- use 5.010;
- use Smart::Comments;
- use AnyEvent::DBI::MySQL;
- my @dbh;
- for ( 1 .. 10 ) {
- $dbh[$_] = AnyEvent::DBI::MySQL->connect('dbi:mysql:database=test', 'test', '');
- $dbh[$_]->selectall_arrayref(
- "select SLEEP(5), 3",
- sub {
- my ($ary_ref) = @_;
- ### $ary_ref
- }
- );
- }
- EV::run;
复制代码 目前完美的异步方案还只有 DBIx::Custom.这个可以连接复用.并可以控制连接池.
所以当你写的上面那个应用 ,每次查询由 helper 创建一个新的连接,高并发的时候,数据会因为连接数死掉,另外创建连接的性能开销比较大.
你不用担心 DBIx::Custom 和 DBIx::Class 一样,我也不太喜欢 DBIx::Class, DBIx::Custom 的封装超级简单,学习成本很小.基本不想用它的语法,都可以用完整的 SQL 语句.
另外,非常稳定,远超过所讲的实验性的. 在日本的商业网站也在使用这个.非常可靠.
你可以看看- use Mojolicious::Lite;
- use EV;
- use DBIx::Custom;
- my $dbi = DBIx::Custom->connect(
- dsn => 'dbi:mysql:database=usertest',
- user => 'root'
- );
- $dbi->async_conf({
- prepare_attr => {async => 1},
- fh => sub { shift->dbh->mysql_fd }
- });
- get '/' => sub {
- my $self = shift;
-
- $self->render_later;
- $dbi->select('SLEEP(5), 3', async => sub {
- my ($dbi, $result) = @_;
- my $row = $result->fetch_one;
- $self->render(text => $row->[1]);
- });
- };
- app->start;
复制代码 我现在连自己的分布文件系统的大部分的接口通信和 Agent 都是用 Mojo 开发的,减少很多工作量.开发超快,性能又好. |
|