取势 明道 优术

作者为 扶 凯 发表

在一个全功能的 Mojolicious 中如果要使用 DBIx::Custom 的配置如下:

has schema => sub {
    my $dbi = DBIx::Custom->connect(
        dsn         => 'dbi:mysql:database=db:localhost:3306',
        user        => 'root',
        password    => '', 
        option      => { 
                        mysql_enable_utf8 => 1,
                        quote_char => '`',
                    },  
        connector   => 1,
    );  

    return $dbi->async_conf({
        prepare_attr => {async => 1}, 
        fh => sub { shift->dbh->mysql_fd }
    }); 
};


注意上面要使用 connector .这样可以工作的更加好,可以使用连接池.并且这个数据库的连接池是进程安全,也是线程安全的.
然后在 startup 中使用 helper 给这个功能包进去,让所有的子类可以调用就好了.

$self->helper(
   db => sub {$self->app->schema}
);

嗯,其它的地方,老实的使用数据库的查询就好,就都支持异步的查询.

sub view {
    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]);
    });
  };



象上面这样,这个数据库的语句是 sleep(5), 3 这个时候这个 SQL 会 sleep 5 秒.但整个过程,你的程序就算是单进程的,也能处理其它的请求.比如你使用 ab 来打 10 个并发,一共 10 个请求.如果是非异步,这个时候单进程,需要 50s .但使用了异步只需要 6s 的样子.

但是,你可能测试异步失败….我就出现了,后来查出来.原来是因为 DBIx::Custom 的模块,内部是使用 EV 来实现的.所以如果这个模块没安装,并不会出错,但就是没法回调.所以只要

$ cpanm EV

就都可以了.你就可以来看看 Mojo 加 DBIx::Custom 给你带来的各种爽.
扩展阅读:
Mojolicious 中使用非 block 的例子(Execute Non-blocking query in MySQL)
https://github.com/kraih/mojo/wiki/Non-blocking-mysql
Mojolicious::Lite 配置 DBIx::Custom 的例子
https://github.com/yuki-kimoto/DBIx-Custom/wiki/Mojolicious%3A%3Alite
Mojolicious 全应用配置使用 DBIx::Custom 的例子
https://github.com/yuki-kimoto/DBIx-Custom/wiki/Mojolicious

来了就留个评论吧! 没有评论