2012-09-12 39 views
0

我們的Web應用程序結構爲3層。 (表示層,業務層,DB層)
所有業務邏輯都在業務層。
表示層向業務層請求CRUD並獲得處理用戶請求的結果。
順便說一下,我們在表示層上配置了讀取超時。 (3 secounds)
在這種情況下,如果某些結果慢慢來自業務層,則用戶會收到錯誤消息,並且CRUD處理正確完成。所以用戶再次嘗試操作。結果,數據被複制。
如何解決這個問題?只是增加閱讀時間?3層java web應用程序讀取超時問題

回答

0

對於業務層長時間運行的事務,你應該執行類似的表示層機制彗星:

  1. 用戶提交的事務,業務層立即返回
  2. 交易在後臺執行業務層
  3. 表示層定期輪詢業務層檢查事務的狀態

不幸的是,日機制通常需要在演示和業務層中進行重大的實施變更。在客戶端,JavaScript框架提供了這些功能。在服務器端,在servlet 3.0中找到的異步Servlet可能會有所幫助。

單獨增加讀取超時很簡單,但在大多數情況下無法讓您擺脫這種情況:如果客戶端請求通過代理/防火牆等等,後者可能會在您的表示層之前超時並關閉連接。

+0

Websockets是投票,彗星等有趣的替代方案。 –

+0

@TobiasRitzau非常真實。 [socket.io](http://socket.io/)是一個有趣的庫,它提供了可以將傳統輪詢技術作爲後備的websockets。 –

0

實現回滾,並在達到超時時執行該操作,或者如果在超時前完成,則只需提交數據庫事務即可。增加超時並不能解決任何問題。

0

最好的選擇的確是讓客戶端收到請求的確認,然後(稍後)確認完成或失敗。這涵蓋了典型的情況,除了失去聯繫或者非常慢的工作。

增加你的超時是明智的3秒的超時對於大多數嚴肅的工作是不切實際的(如果服務器暫時忙或者你有網絡延遲?)。