2013-02-02 48 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