2011-11-24 31 views
1

我想我可能不是第一個出現這個問題的人。 有時,用戶向服務器提交了一堆數據,這些數據將在響應頁面中顯示。爲了給用戶提供數據提交和處理速度很快的錯覺 。我們通常會異步執行此操作。 現在的問題是,出於某種原因,這些數據需要先到達數據庫, 並被提取出現在響應頁面中。如果響應頁面太快地向用戶顯示 ,則異步提交可能無法完成;現在我打電話暫停在ejb中執行一段程序

Thread.sleep();

在我調用setResponsePage()之前。

但在EJB中不推薦使用本地線程。任何人都知道替代品謝謝

回答

0

剛剛在這個問題中討論過:Thread.sleep() in an EJB

我將邏輯分成兩個EJB:一個用於將用戶數據插入到數據庫中,另一個用於獲取它。您的Web層會一個接一個地調用,導致兩個單獨的事務,這些事務應該由數據庫正確定購(仍然可能取決於其他因素,如事務隔離)。

編輯

sleep()的問題是,你永遠不知道要等待多長時間,所以它幾乎總是一個壞主意。我在這裏看到一個案例,用於Ajax推送—您的EJB應該立即返回一個頁面,在處理完成後將數據推送到該頁面。我不會就這個話題進一步提供建議,因爲我遠離這方面的專業知識。

仍然不完善但優於sleep()可能會在數據庫鎖上同步:第一個EJB會插入數據並在其事務中鎖定某個記錄,第二個EJB會嘗試鎖定相同的記錄並讀取數據。這樣第二個EJB就會等待最短的時間。

+0

將邏輯分成2個事務並對其進行適當排序是有意義的。問題是,插入可能需要很長時間。例如,我們將圖像的元數據插入數據庫,同時向雲中上傳多份不同大小的副本。不過,我們可以分成兩步:更新數據庫和上傳圖片。 我使用EJB 3.0,它支持org.jboss.ejb3.common.proxy.plugins.async.AsyncUtils.mixinAsync()。我不知道在通過異步代理調用任務時多快執行。所以我需要暫停過程一段合理的時間。 – Wangge

+0

@Wangge擴展答案。 – MaDa