Java多线程变慢

时间:2015-08-29 15:10:01

标签: java multithreading jax-ws

我们有运行几个线程的代码。在线程的run事件中,我们调用2个Web服务。当达到2000号迭代时,我们遇到了性能问题。每个Web服务调用的过程大约需要600毫秒,并且随着它的继续,它可能会持续近60秒......

每个Web服务的实际执行保持一致,但端口创建变慢:

long preStartTime = System.currentTimeMillis();

ServicePortType winPort = (ServicePortType) this.getConnector().getFactory().create();

long preEndTime = System.currentTimeMillis();
LOGGER.debug("@@@Web Service Prep work (1st service) took => " + (preEndTime - preStartTime) + "ms");

这将在大约80毫秒开始时记录,并且当过程继续运行时,在2000次迭代时它可以达到50秒:

(iteration 1)    @@@Web Service Prep work (1st service) took => 80ms
(iteration 2000) @@@Web Service Prep work (1st service) took => 524421ms

以下是连接器设置:

    @Override
    public void init(Properties prop) {
    LOGGER.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
    LOGGER.info("@@@@@@ Starting HTTPConnector @@@@@@@@@@@@@@");
    LOGGER.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
    try {
        factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(ServicePortType.class);
        LOGGER.debug("@@@URL : " + prop.getProperty("service.url"));
        factory.setAddress(prop.getProperty("service.url"));
        factory.getInInterceptors().add(new LoggingInInterceptor());
        factory.getOutInterceptors().add(new LoggingOutInterceptor());
    } catch (Exception ex) {
        LOGGER.error(ex);
    }

    LOGGER.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
    LOGGER.info("@@@@@@ End HTTPConnector @@@@@@@@@@@@@@@@@@@");
    LOGGER.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
}

有人能指导我吗?

修改

我改变了这个被调用的部分,每次都是静态的,只创建一次。现在表现很好,但不知道这是否会影响其他任何事情。

由此:

ServicePortType winPort = (ServicePortType) this.getConnector().getFactory().create();

对此:

private static UVSInterfaceExtendPortType winPort;
if (winPort == null)
{
   winPort = (UVSInterfaceExtendPortType) this.getConnector().getFactory().create();
}

1 个答案:

答案 0 :(得分:1)

我的解决方案是只将portType实例化一次,而不是每次都实例化(如我的编辑中所述)。

我们每天进行大约100k次交易,整个交易的速度保持在一秒以下,包括2个网络服务电话和几个数据库电话。