Mojolicious数据库操作(五)

一、同步与异步

IO操作都是堵塞的,但是我们可以借助于 Mojo::IOLoop 模块的事件循环机制,异步的查询那些等待时间很长的SQL语句而继续执行其他的任务。

每一个数据库连接,在同一时间内只能处理一条SQL语句,即便这个查询是异步的也不例外,这就是说,即便我们有两条异步的查询,这两条语句也需要一条一条的执行。

如果我们想并发的执行多个查询,那么我们就需要多个数据库连接:

# 按顺序执行 (10秒钟)
my $db = $mysql->db;
$db->query('select sleep(5)' => sub {...});
$db->query('select sleep(5)' => sub {...});

# 同步执行 (5秒钟)
$mysql->db->query('select sleep(5)' => sub {...});
$mysql->db->query('select sleep(5)' => sub {...});

#通过上面的例子,我们可以清楚地知道,同一个$db代表着一个连接。而$mysql->db则代表着多个连接。

当我们通过fork启动新的子进程时,mojo::mysql对象会自动的重置缓存,确保进程之间不会相互干扰。这保证了mojo::mysql模块是安全的。

二、事件

英文成为Events,mojo::mysql继承了Mojo::EventEmitter的所有事件。此外,还新增了一个connection连接事件,当数据库发生连接时触发:

$mysql->on(connection => sub {
my ($mysql, $dbh) = @_;
...
});

三、属性之抽象类

所谓的抽象,abstract,就是前面讲例子时提到的,不通过SQL语句而是通过方法来操作数据库。Mojo::mysql默认使用了SQL::Abstract::mysql模块作为抽象类。而abstract属性的意义在于方便我们更换为其他抽象模块:

$abstract = $mysql->abstract;
$mysql = $mysql->abstract(SQL::Abstract::mysql->new);

除了上面的作用,我们还可以借助abstract生成SQL查询语句:

# 生成查询语句和绑定值
my ($stmt, @bind) = $mysql->abstract->select('names');

 

 

标签