這裏是解決在Web應用程序中長時間運行的查詢問題(異步請求)
企業Web應用程序的用戶正在執行導致長(超長)數據庫查詢任務的問題(或其他長期處理密集型任務)
問題:
- 請求超時 - 經過一段時間的用戶可能會收到一個請求超時
- 會話超時 - 如果沒有使用會話保持方法,一個SES可發生錫安超時
- 請求線程鎖
- 由於請求線程沒有返回,可能會阻止新的requrests(如果達到了池限制)
- 在某些應用服務器的服務器的健康狀況可能會觸發強制(由於長時間運行的請求的線程)的節點或應用程序的重啓
- 如果用戶離開頁面:
- 交易沒有被取消 - 導致無用的處理,沒有人會受益於
- 用戶不能返回看到的結果,他們完成
- 沒有取得任何進展跡象之後 - 用戶只需等待頁面刷新
我提出了幾種解決方案,但我不確定哪個更好(在所有方面,性能,最佳實踐,優雅和可維護性),我想知道您推薦的解決方案是什麼,如果存在我錯過了一個解決方案? (可能是肯定的,而且很多)
壞的解決方案:使用請求線程的工作線程,保存在會話進度狀態,有一個AJAX調用另一個相同常要求
檢查狀態(會話)妥協解決方案:創建您自己的線程池,處理監視線程,工作線程並通過同步分佈式事務性高速緩存或持久性存儲中的狀態來照顧集羣。這會釋放請求,但會創建應用程序服務器不知道的線程,並且不會在取消部署中關閉。它取決於你以一種乾淨的方式關閉線程,並且總是有可能最終泄露一些東西。這也不是J2EE的方式。
的J2EE解決方案:使用JMS的異步任務,這就是它是
春節的解決方案換貨:使用Spring Batch的
你會怎麼做/在你的項目做?還有哪些其他解決方案?我認爲上面哪個是你認爲的贏家?
寫得好的答案,謝謝 – 2009-12-30 14:43:38
@Ehrann:謝謝!實施它,讓我知道你是否有一個更順利的解決方案... – raoulsson 2009-12-30 21:56:09