2013-02-02 82 views
1

我的基於Java的Web應用程序正在與遠程WSDL Web服務進行交互。緩存WSDL響應的高效方法

我構建了一個服務特定的WSDL請求。我用HTTP客戶端發出這個WSDL請求,並取回一個WSDL響應。

由於我的情況是可以接受的,爲了優化性能和帶寬使用,我想緩存WSDL響應,以便下次發佈相同的請求時,我的web應用程序可以直接加載持久響應數據庫。

With JAXB.marshal and JAXB.unmarshal我可以在序列化XML格式和「Java對象表示」中獲得響應的表示形式。所以我有了設置一個數據庫的想法,這個數據庫保持了編組的XML表示。但是在我的情況下,典型響應的XML文件表示很容易爲200千字節。正如我們對XML文件所知,這個大小與XML的詳細程度有關,可能會大大減少,以優化數據庫容量使用率和數據庫讀寫速度。

緩存和持久化WSDL響應是否有效?也就是說,我正在尋找一種實現函數映射的好方法f(someWSDLRequest) -> someWSDLResponse

+0

WSDL請求?你的意思是一個SOAP請求/響應,對吧? – home

+0

是的,這是一個SOAP支持請求/響應WSDL – Abdull

+0

你怎麼知道緩存是髒的? –

回答

1

要緩存,您需要一個密鑰和一個值。在這種情況下,值顯然是來自SOAP服務的響應。

對於關鍵,爲什麼不嘗試將參數連接成一個字符串(我之前已經看過這樣做了很多次)或者對請求做了MD5散列。它使緩存密鑰變得簡單小巧,如果請求相同,它將始終保持一致。

當一個請求進來,你有一個緩存響應,提供它。

如果它不存在,從數據庫中獲取它,將它放入緩存中,然後提供它。

如果底層對象發生更改(緩存的響應),則使緩存無效,或者只需在其上放置過期時間並讓它隨時間發生。

+0

謝謝,這些已經是很好的想法和考慮!關鍵字作爲字符串生成:關鍵字應該最好是規範化的(即應該有請求參數的總順序)以減少不必要的重複條目。例如'(someValueForParameterA,someValueForParameterB)'和'(someValueForParameterB,someValueForParameterA)'應該具有相同的密鑰串表示。 ...關於SOAP/XML響應:爲了有效地堅持它,可能[原生XML數據庫](http://en.wikipedia.org/wiki/XML_database#Native_XML_databases)將會很有用...? – Abdull

+0

是的,對於密鑰生成,我總是將它從左到右編寫 - 而且您使用的是參數值,而不是參數名稱。要堅持迴應,請使用Memcached或Couchbase或Redis之類的東西。 – ryan1234