我们的 Spring 应用程序使用 RestTemplate 通过 Exchange() 方法向 Web 服务端点发送 HTTP 1.1 请求。99.8% 的情况下,这工作正常,但在 0.2% 的情况下,这会导致调用restTemplate.exchange() 和我们的负载均衡器记录 HTTP 请求(然后转发)之间的较长(10-180 秒)延迟到网络服务)。RestTemplate 是在没有指定备用 ClientHttpRequestFactory 的参数的情况下初始化的,所以我知道这段代码没有利用连接池,例如通过如下方式初始化它:
restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory())
Run Code Online (Sandbox Code Playgroud)
这是否能从逻辑上解释我所描述的症状,还是我应该继续调查?
这是代码片段,.exchange() 的最后一行在一小部分时间内会产生缓慢的性能。
private <T> ResponseEntity<T> request(String project,
String url,
HttpMethod method,
HttpEntity<String> request,
ClientHttpRequestInterceptor moduleInterceptor,
ParameterizedTypeReference<T> parameterizedTypeReference) {
log.info("request(): url - {}", url);
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
if (moduleInterceptor != null) {
interceptors.add(moduleInterceptor);
}
restTemplate.setInterceptors(interceptors);
try {
ResponseEntity<T> response = restTemplate.exchange(url, method, request, parameterizedTypeReference);
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用类似于以下查询的查询来查找两个表之间的差异(DEV 数据库与 TEST 数据库中的同一个表)。每个表有约 30K 行和约 5 列。
select field1,field2,field3,field4,field5 from dev.dbo.table1
where field1+field2 in ('string1','string2','string3',...,'string50')
except
select field1,field2,field3,field4,field5 from test.dbo.table1
where field1+field2 in ('string1','string2','string3',...,'string50')
Run Code Online (Sandbox Code Playgroud)
字段 1 是char(5),字段 2 是char(1)
这个查询基本上永远不会终止。
当我使用 分析此查询时SET SHOWPLAN_ALL ON,我可以看到树中有一个相当高的嵌套循环。当我将上面的查询更改为
select * from dev.dbo.table1
except
select * from test.dbo.table2
Run Code Online (Sandbox Code Playgroud)
查询运行速度很快,并且执行计划中没有嵌套循环。
有人可以帮忙解释一下吗?我不明白为什么会有如此巨大的差异。