MySQL的异步操作

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

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

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

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

100225_l2qG_1443697.png

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

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

转载于:https://my.oschina.net/pikeman/blog/194901

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值