2012-05-10 49 views
5

我与Oracle和Mysql一起工作,我很难理解为什么这些API没有写出来,以至于我可以发出呼叫,离开并执行其他操作,然后再回来接收它,例如NIO - 我被迫专用线程来等待数据。似乎SQL接口是同步IO仍然被强制的唯一地方,这意味着绑定等待数据库的线程。为什么主要数据库供应商不提供真正的异步API?

有人可以解释这个原因吗?是否有一些基本的东西使得这很难?

能够使用1-2个线程来管理我的数据库查询问题和结果提取而不是使用工作线程检索数据将是一件好事。

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

+0

我也对此感到惊讶。 –

回答

1

数据库服务器应该能够处理数千个客户端。为了提供异步接口,数据库服务器将需要将查询中的结果集保存在内存中,以便在稍后阶段进行查询。它会很快变得资源不足。

+1

我在一定程度上看到了你的观点 - 尽管这一切都必须发生;获取较大的结果通常不会一次检索整个结果集。 – jasonk

1

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

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

要做到这一点正确的交易将不得不通过回调来完成,但它们不是。我知道只有node.js这样做,但不清楚它是否真的异步。

当然,即使你做异步我不确定它是否真的可以提高性能作为数据库本身,如果可能做到同步。

有很多的方法,以避免在(Java)的人口过多线程: Is asynchronous jdbc call possible?

亲自来解决这个问题,我使用了一个消息总线一样的RabbitMQ。

相关问题