MySQL的异步操作

我们知道,对于服务器来说,最好的情况就是IO不被阻塞(non-blocking),这样才能充分利用带宽。因此,如果一个服务,在查询数据库的时候被阻塞了,那就是犯罪。大多数数据库提供异步操作以实现调用函数的非阻塞,mysql也不例外。

缺省情况下,mysql使用的是同步操作,如果一个查询在服务器上需要花费10秒钟,你调用函数就会阻塞10秒钟。为了使用异步的功能,我们需要在建立链接或者在prepare的时候加上async选项。

在一些常用的MySQL异步模块里边,通常的做法是用反应器监听链接。有数据来了通知调用方。也有用进程fork来实现。个人认为fork进程的开销太大,实在不能使用。

MySQL的一个数据链接上只能同时进行一个查询。如果采用异步操作,就要小心了。我们必须为每个异步操作分配一个独立的链接。
一个常用的做法是预分配一个链接池。每个请求从池里边取出一个句柄。当池空时,采用一些策略,比如阻塞调用者,或者增加池容量等。
在Perl里边,我们可以自己非常简单的包装一个异步模型。
比如下面的代码:

MySQL的异步操作_第1张图片

这里没有考虑池的容量,get/put对应从池里边去和放回池。

使用者可以跟CPAN里边的AnyEvent::DBI或者DBIx::Custom比较下。想封装成一个package也是非常容易的。有兴趣的可以自己试一试。

你可能感兴趣的:(MySQL的异步操作)