我在Spring WS 2.1.0上有一个Web服务。 Web服务在Tomcat 7上运行,并使用一种事务方法实现端点,该方法从数据库读取数据并生成不同的报告。 Tomcat 7通过JServ协议在Apache Server后面运行。
在通过Apache JMeter进行压力测试期间,我得出结论,同时处理请求是串行处理的。起初我试图调整数据库连接池(commons-dbcp和更高版本的tomcat-jdbc),但结果是一样的。端点方法只读取数据,因此没有读后读或写后读依赖,并且可以并行处理事务。因此问题在于HTTP连接处理。
经过一些搜索(当然还有谷歌搜索),我发现Spring WS附带了单线程的默认连接管理器(SimpleHttpConnectionManager)。好的做法是用MultiThreadedHttpConnectionManager替换SimpleHttpConnectionManager。我找到了如下所示的示例代码:
<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
<constructor-arg>
<bean class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager>
<property name="maxConnectionsPerHost" value="20"/>
<property name="maxTotalConnections" value="100"/>
</bean>
</constructor-arg>
</bean>
但是这个例子对我来说并不是很清楚,因为我不明白Spring如何使用HttpClient(指ID或自动装配它)。那我怎么能在我的案例中使用MultiThreadedHttpConnectionManager和Spring?我应该在哪里注入此类的已配置实例?
答案 0 :(得分:5)
您误解了HttpClient
的用法。它仅在Spring WS 客户端模块中用于启动HTTP连接,请参阅6.2.1.1.1. HTTP transports:
在服务器端使用Spring WS时,根本不需要
WebServiceMessageSender
接口有两种实现方式,用于通过HTTP发送消息。 [...]替代方案是CommonsHttpMessageSender
,它使用Jakarta Commons HttpClient。
HttpClient
。在这种情况下,它是提供HTTP(服务器)抽象的servlet容器。查看您的Tomcat配置,可能是线程池太小而某些请求已排队? HttpClient
绝对无关。对不起,你必须在其他地方寻找问题。
为了保持答案的完整性,当您使用Spring WS访问其他计算机上的SOAP服务时,HttpClient
的以下设置适用:
maxConnectionsPerHost
- 允许多少并发连接HttpClient
保留在同一主机上(请参阅:Keep-Alive
标头)?大多数浏览器将同一主机的并发连接数限制为2/4/8。 HttpClient
遵循该行为,因此原则上您不能有超过2/4/8(无论您在此处设置)与同一主机的并发连接。
maxTotalConnections
- 如上所述,但总计为所有主机。如果要连接到不同服务器上的数百种不同的Web服务,这是HttpClient
可以保留的打开连接总数