servlet中的Web服务客户端引用

时间:2009-11-20 14:01:47

标签: java web-services servlets

我有一个servlet,该servlet使用.net Web服务来执行某些功能。为此,我使用“jax-rpc”样式客户端在Netbeans中创建了Web服务客户端。

假设我的服务名称为“Tester”。然后,两个生成的类称为“Tester”和“TesterSoap”。

要获得对Web服务的引用,我需要这样做:

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

要使用网络服务,我可以这样做:

tsoap.runTest();

我的问题是,因为这是一个多次执行的servlet,我应该将前两行存储在静态变量中(所以它们只执行一次),或者将它们存储在本地,以便每次servlet执行时都执行它们执行?

提出同一问题的另一种方式:每次调用前两行时是否会有性能损失? (我正在本地测试所有内容,因此很难测量)。

...谢谢

2 个答案:

答案 0 :(得分:0)

如果Tester_Impl()类和方法getTesterSoap()的默认构造函数和任何初始化块没有做任何昂贵的事情(例如从磁盘读取文件,从DB加载数据,连接套接字)等等,但我认为它没有)那么你不需要担心它。

您可以考虑将它们声明为从HttpServlet扩展的类的实例变量。但是,一个很大的,它将在所有HTTP请求之间共享,因为在整个应用程序的生命周期中只有一个特定的servlet类实例。因此,如果Tester_Impl类应该具有状态,那么将它声明为实例变量是一个非常糟糕的主意。然后它将在所有请求之间共享。换句话说,它不是线程安全的。如果你想确保servlet中的线程安全,那么在同一个方法块中声明所有内容。

答案 1 :(得分:0)

我不会在这里过早优化。尽可能靠近生产环境进行测试(即不在本地盒子上)并查看性能影响。我过去所做的就是编写一个小的shell脚本,用wget n次触发我的服务器,延迟k毫秒,然后测量延迟,可能用一些时间检测代码或者自己进行分析(或使用jvisualvm或者一些其他分析工具)。

如果您想在不进行测试的情况下保护您的设计免受可能的性能影响,您可以使用工厂提供服务客户端的实例,然后您可以随时更换单个服务客户端,无论何时您感觉它