2015-06-13 113 views
2

經過相當多的研究之後,我決定繼續寫下一個在堆棧溢出中可能看起來相當多餘的問題,但我只是問,因爲我沒有找到我的答案。我一直對Java NIO2框架有一些樂趣,它極大地提高了我的應用程序的可伸縮性。 (我們之前使用舊式I/O TPC服務器/客戶端設置來安裝一些適度的模擬服務器),並讓我告訴你。如果你知道我的意思,那麼併發是B皇后。異步檢索SQL查詢執行結果。

我們正在從使用線程作爲所有事情的答案(試圖更好地實踐並更熟悉推進技術)。以前,我們爲用戶數據使用平面文件存儲(文本/二進制格式存儲),並將所有內容都遷移到SQL數據庫。

雖然這樣做我已經注意到通常沒有問題,但是在數據庫上等待永遠不會有趣,並且在模擬的遊戲環境中等待數據庫調用從來沒有樂趣,尤其是當整個遊戲服務器在等待。這是我們通常會替換線程的地方。爲什麼不只是使用Thread pool或類似的命令在另一個線程上執行SQL調用。

對於任何類型的異步事件,Java NIO2 CompletableFuture<K,V>確實是一個很大的幫助,但是我一直在試圖找到一種將這種方法用於SQL調用的方法。我認爲編寫我們自己的使用NIO2的JDBC版本始終是一種選擇,但它看起來有點過度消耗,可能需要更多的時間和金錢。請記住,我們只是一個小型模擬社區,而不是一個大型企業,但我們確實想確保爲用戶提供質量。

我正在調查jooQ這似乎沒問題,但它也似乎有點過分殺。這使用CompletableFuture#supplyAsych方法,但可用的例子並沒有真正解釋它的深入。但是它混在這句話:

總是會有一個阻隔屏障這樣的解決方案,那就是 JDBC本身 - 這是很難變成一個異步API。實際上,很少數據庫確實支持異步查詢執行。

但是,數據庫不一定需要支持異步查詢執行,才能在異步上下文中提供結果。如果我的服務器沒有等待(只等待)API才能獲得查詢結果,那麼這是唯一真正重要的事情。與此相似的活動可以使用來自Unity的腳本參考的示例來解釋:CoRoutines

請不要推薦Scala。

+0

您*可能*想要查看[異步jdbc調用可能嗎?]的答案(http://stackoverflow.com/questions/4087696/is-asynchronous-jdbc-call-possible)。 –

+0

@ PM77-1感謝您的鏈接,但我已閱讀該頁面上的所有內容。它在幾年前被問過,似乎沒有得到最近的關注。 – Hobbyist

+0

@ Christian.tucker - 10如何回答不太重視?說真的,如果你想讓人們更多地關注它,那麼**正確的方式就是發佈獎勵。 –

回答

1

Java NIO2的級別太低,無法爲您提供幫助。

開發JDBC的異步版本的你「思想泡沫」是有問題的,原因有二:

  • 它確實不適合與事務在JDBC API層之上實現的方式(即在應用程序代碼)。同時在較少數量的線程上處理多個事務的應用程序將變得更加複雜。更復雜(通常)意味着不太可靠,這不是您在執行(常規)數據庫操作時想要的。

  • 設計一個異步JDBC API是一回事,但實現它是另一回事。這裏真正的問題是,真正的工作是在多個 JDBC驅動程序發生:

    • 一些驅動程序是專有的。
    • 所有驅動程序都會將某種非標準「協議」與後端數據庫(在JVM中或通過網絡連接)進行對話。
    • 這些協議(AFAIK)在本質上總是同步的,並且通常是專有的。
    • 用支持異步模式的東西更新或替換協議需要自行更改數據庫實現。

那麼解決方案是什麼?

那麼這個問答& A有一定的聯繫,以試圖實現異步數據庫API項目:「Is asynchronous jdbc call possible?」。我想,如果你不滿意(即進度或API),你可以開始你自己的項目。但是,您有可能遇到同樣的設計和實施問題。

另一種方法可能是完全放棄SQL和ACID,並查看一些所謂的「NoSQL」數據庫,以查看它們是否爲您提供了所需的異步API和行爲。

+0

感謝您的回覆,我最終開始開發自己的小型數據庫引擎。這並不是什麼大的事情,我也不指望它能像測試過的解決方案一樣運行,但是現在它正在滿足我們的需求。我用一個同步查詢執行器使用NIO2實現了數據庫服務器。 (自定義查詢語言)以防止數據庫數據損壞。目前的問題主要與將數據加載到數據庫服務器上的內存有關。需要找到一種合適的方式來索引/緩存堆中的數據,而不會使用過多的內存。仍將SQL用於其他與Web相關的項目。 – Hobbyist