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');