2009-11-20 47 views
0

我有一個servlet,並且該servlet使用.net Web服務來執行某些功能。爲此,我使用「jax-rpc」風格的客戶端在Netbeans中創建了webservice客戶端。Web服務客戶端引用,在一個servlet

假設我的服務名稱是「Tester」。然後兩個生成的類稱爲「測試器」和「TesterSoap」。

要到Web服務的引用,我需要這樣做:

Tester t = new Tester_Impl(); 
TesterSoap tsoap = t.getTesterSoap(); 

要使用Web服務,然後我就可以做到這一點:

tsoap.runTest(); 

我的問題是,因爲這是一個被執行多次的servlet,我應該將前兩行存儲在靜態變量中(因此它們只能執行一次),或者將它們存儲在本地,以便每次執行servlet時都執行它們?

提出同樣問題的另一種方法是:每次調用前兩行時是否都有性能問題? (我在本地測試一切,所以很難衡量)。

謝謝...

+0

您應該考慮使用比JAX-RPC更新的東西,而JAX-RPC現在是一個停用的API,由JAX-WS取代。 – skaffman 2009-12-25 11:30:00

回答

0

如果默認的構造函數和任何Tester_Impl()類的初始化塊和getTesterSoap()什麼都不做昂貴的方法(例如從磁盤讀取文件,加載數據從數據庫,一個連接插座等,但我認爲它不),那麼你不需要擔心它。

您可以考慮將它們聲明爲從HttpServlet延伸的類的實例變量。但是,一個大的但是,它將在所有HTTP請求之間共享,因爲在整個應用程序的生命週期中,只有一個特定servlet類的實例。因此,如果Tester_Impl類應該有一個狀態,那麼將其聲明爲實例變量是一個非常糟糕的主意。然後它將在所有請求中共享。換句話說,它不是線程安全的。如果你想確保servlet中的threadsafety,那麼在同一個方法塊中聲明所有內容。

+0

是的,我理解了所有這些,但我的問題是您自己提到的問題:JAX-RPC生成的代碼究竟做了什麼,我需要擔心與此代碼的併發性? – user85116 2009-11-20 15:18:03

0

我不會在這裏過早優化。在儘可能接近生產環境的情況下(即不在本地盒子上)對其進行測試,然後查看性能影響。我過去所做的是編寫一個小shell腳本,用wget n次,並延遲k毫秒來測試我的服務器,然後測量延遲,可能用某個時間測試代碼或者自行分析代碼(或者使用jvisualvm或某些其他分析工具)。

如果您希望在不進行測試的情況下保護您的設計免受可能的性能影響,可以使用工廠提供服務客戶端的實例,然後您可以隨時換掉單身服務客戶端它。