我有一个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执行时都执行它们执行?
提出同一问题的另一种方式:每次调用前两行时是否会有性能损失? (我正在本地测试所有内容,因此很难测量)。
...谢谢
答案 0 :(得分:0)
如果Tester_Impl()
类和方法getTesterSoap()
的默认构造函数和任何初始化块没有做任何昂贵的事情(例如从磁盘读取文件,从DB加载数据,连接套接字)等等,但我认为它没有)那么你不需要担心它。
您可以考虑将它们声明为从HttpServlet
扩展的类的实例变量。但是,一个很大的但,它将在所有HTTP请求之间共享,因为在整个应用程序的生命周期中只有一个特定的servlet类实例。因此,如果Tester_Impl
类应该具有状态,那么将它声明为实例变量是一个非常糟糕的主意。然后它将在所有请求之间共享。换句话说,它不是线程安全的。如果你想确保servlet中的线程安全,那么在同一个方法块中声明所有内容。
答案 1 :(得分:0)
我不会在这里过早优化。尽可能靠近生产环境进行测试(即不在本地盒子上)并查看性能影响。我过去所做的就是编写一个小的shell脚本,用wget n次触发我的服务器,延迟k毫秒,然后测量延迟,可能用一些时间检测代码或者自己进行分析(或使用jvisualvm或者一些其他分析工具)。
如果您想在不进行测试的情况下保护您的设计免受可能的性能影响,您可以使用工厂提供服务客户端的实例,然后您可以随时更换单个服务客户端,无论何时您感觉它