2017-09-13 103 views
0

我正在創建一個futures_cpupool::CpuPool,其中每個線程都需要打開數據庫連接,這是一個昂貴的初始化。這些初始化的狀態需要在作業之間保持持續,因爲它們需要很長時間才能建立。數據庫連接對於工作線程來完成他們的工作是必需的。如何保存「CpuPool」工作線程的狀態?

+0

注意:''CpuPool'專門用於激烈的CPU工作,最主要的原因是它阻塞整個線程,因此,不建議在上述工作期間使用網絡連接。 –

+0

我不明白爲什麼它會阻止整個線程@MatthieuM。 – njaard

+0

如果您有長期存在的事務,這是一個可伸縮性問題:您需要更多的線程。 CpuPool是爲CPU限制任務設計的,將它用於其他任何可能都不太理想......儘管它當然對你來說可能已經足夠了。 –

回答

0

免責聲明:有可能是一個更好的解決方案充分利用一些CpuPool API,也許...

簡單的解決辦法是使用一個單獨的ConnectionPool,與Arc共享。

然後,你只需當你啓動一個線程,並要求他們獲得從那裏連接交給ConnectionPool參考。

池本身將負責:

  • 準備新的連接(執行初始化工作),
  • 回收用過的連接,以便提出進一步的要求得到滿足更快。

如果連接參數發生變化(例如,指定不同的區域設置),這裏有一點困難。我建議每個客戶都被交給一個「新鮮」的連接,所有的設置都被標準化爲一個已知的值。

還有什麼時候(和在哪個線程上)執行初始化和回收工作的設計選擇;我建議你從最簡單的解決方案:

  • 初始化點播,
  • 回收時立即移交。
+0

ConnectionPool在哪個箱子裏?這也不是一個理想的解決方案,因爲不能保證一個線程總是獲得相同的連接。這是更好的行爲,因爲不需要「發送」並具有稍好的NUMA行爲。 – njaard

+1

@njaard:這不是箱子,你必須自己寫。如果您認爲它很重要,歡迎您推薦線程親和力,但老實說,在數據庫連接中,網絡部分與CPU /內存相比非常緩慢,我甚至不會打擾。 –