2012-05-10 47 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。

相關問題