2012-02-10 36 views
1

我正在使用boost.asio在C++中編寫網絡應用程序。boost.asio和對數據庫的查詢

我需要做三件事情:

  1. 使從客戶端
  2. 連接發出請求到數據庫
  3. 將結果返回給客戶端。

除2中的所有操作是非阻塞模式。但是在數據庫查詢期間,所有的應用程序都被阻塞,並且其他客戶不能正常運行。

我該如何處理這種情況?

+1

我要去無路可退,並與所提供的有限的信息說,字面上有辦法讓你「在這種情況下,」無限號。你能提供更多的信息嗎?你有什麼嘗試,什麼是工作,什麼不是?什麼是數據庫平臺?後端數據庫是否支持多個併發查詢?你在任何地方使用鎖或互斥鎖嗎?您可以爲您認爲可能導致問題的位置提供的任何代碼? – Chad 2012-02-10 21:30:14

回答

0

如你沒有提供你的情況的詳細說明我假設,你想處理在許多concurent線程客戶端的連接。 連接處理程序在線程中運行,稱爲io_service::run()

您可以創建線程處理連接處理程序(並等待最終確定數據庫連接),從多個線程運行io_service::run()池。見Boost.Asio docs

0

不幸的是,有許多外部庫不提供異步接口。當圖書館試圖抽象出它的一些重要方面時,這種情況通常會發生。在這種情況下,數據庫接口abstraction is leaking通過阻塞您的線程來阻止網絡請求。

除非你的數據庫供應商提供了一個異步接口(我懷疑這一點,從來沒有見過一個做),你將不得不面對這一事實,這個塊。您基本上必須考慮它幾乎等於完成運行CPU密集型計算的任務。

您將需要產生一個額外的線程來發出請求,而不會阻止異步I/O完成處理程序將此工作轉移到另一個進程並使該進程阻塞數據庫查詢。這是網絡服務器的常見設計,網關只是將I/O轉發給應用程序服務器,然後應用程序服務器以同步方式工作而不會阻塞網關。