为什么主要数据库供应商不提供真正的异步API?

时间:2012-05-10 10:32:57

标签: database asynchronous

我使用Oracle和Mysql,我很难理解为什么不编写API以便我可以发出呼叫,离开并做其他事情,然后再回来拿起它,例如NIO - 我是被迫专门用一个线程来等待数据。似乎SQL接口是唯一仍然强制同步IO的地方,这意味着要占用等待数据库的线程。

有谁可以解释原因?是否有一些基本因素使这很困难?

能够使用1-2个线程来管理我的数据库查询问题和结果获取,而不是使用工作线程来检索数据,这将是很棒的。

我注意到在实现异步API时有两次实验尝试(例如:adbcj)但似乎没有为生产使用做好准备。

2 个答案:

答案 0 :(得分:1)

数据库服务器应该能够处理数千个客户端。要提供异步接口,DB服务器需要将查询的结果集保留在内存中,以便您可以在以后阶段进行查找。它很快就会失去资源。

答案 1 :(得分:1)

异步的一个相当大的问题是许多库使用threadlocal进行事务。

例如在Java中,许多JDBC规范依赖于同步行为来实现单个线程的每个事务。那就是你按程序顺序编写交易。

要做正确的交易必须通过回调来完成,但事实并非如此。我知道只有node.js这样做,但不清楚它是否真的是异步。

当然即使你做异步,我也不确定它是否会真正提高性能,因为数据库本身可能是同步的。

有很多方法可以避免(Java)中的线程过多: Is asynchronous jdbc call possible?

就个人解决这个问题,我使用像RabbitMQ这样的消息总线。