5

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

任何人都可以解释这其中的原因吗?有什么基本的东西使这变得困难吗?

如果能够使用 1-2 个线程来管理我的数据库查询问题和结果获取,而不是使用工作线程来检索数据,那就太好了。

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

4

2 回答 2

1

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

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

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

当然,即使您执行异步操作,我也不确定它是否会真正提高数据库本身的性能,如果它可能是同步执行的。

有很多方法可以避免 (Java) 中的线程过多: 异步 jdbc 调用是否可行?

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

于 2012-07-09T15:55:20.353 回答
1

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

于 2012-05-10T11:07:47.360 回答