2012-07-13 99 views
3

我從其他幾篇文章中瞭解到我對JAX-WS web服務的理解,他們不是線程安全的。我的Web服務將被100個客戶端調用,我們需要能夠處理大約200次交易/秒。JAX-WS web服務線程安全和性能問題

如果我在訪問數據庫的代碼周圍引入synchronized關鍵字,我的web服務將與數據庫進行交互以執行它的工作,我基本上將確保一次只有一個線程訪問數據庫,不知我是否會在這種情況下仍然能夠達到所需的吞吐量。在此先感謝您的幫助。

我被告知實際上將數據庫訪問工作轉移到另一個類中,並在方法級別實例化該類,這樣我就不需要使用synchronized關鍵字並仍然實現線程安全。那是對的嗎?

回答

2

如果您需要事務和線程安全性,那麼您爲什麼不僅僅使用EJB作爲JAX-WS端點?

+0

對不起,我還沒有探索過這個選項呢..會馬上做到..順便說一句,使用無狀態EJB,您仍然可以以平臺不可知的方式向您的客戶展示您的Web服務。 – 2012-07-13 17:23:05

+1

從客戶的角度來看,它仍然是平臺不可知論的。只是端點實例的功能和生命週期會有所不同。基本上把你所有的JAX-WS註釋放在一個@Stateless bean上。 http://docs.oracle.com/javaee/6/tutorial/doc/bnbor.html – Chase 2012-07-14 03:47:01

+0

Thx爲您的回覆@Chase我正在尋找更多沿這些線路的答覆..我會檢查這一點,並接受您的答案,如果這爲我工作... – 2012-07-14 15:44:26

1

我們需要關於應用程序的更多信息。

一般來說 - 對於你描述+數據庫訪問的情況下的性能,我建議。

  1. 仔細規劃數據庫 - 指數在可能/是有道理的,使用的意見,等等...
  2. 嘗試使用一個數據庫,具有良好的鎖定機制(每行鎖)。這樣,當兩個請求訪問不同的行時,您不會受到整個表鎖定的影響。
  3. 讓您的交易儘可能短。如果使用EJB - 確保「讀取數據」方法的事務範圍不是Required或RequiredNew(這可能會導致打開一個事務)。
  4. 如果確實使用同步 - 請小心使用正確的鎖定。不要試圖自動使用「同步」作爲其最簡單的代碼。考慮在可能的情況下使用ReaderWriterLock。
  5. 考慮在可能的情況下使用緩存,但仔細計劃這一點,以便您的流程處理「相關」數據。

從這些方向開始 - 我想你會看到你可以實現你的性能目標。

+0

謝謝@zaske。我將在實施解決方案時考慮這些建議。 – 2012-07-14 15:45:56