我有这个代码在
@RestController
:
@GetMapping("get_sound/{name}")
@CrossOrigin
public ResponseEntity<byte[]> getSound(@PathVariable(name = "name") String name) throws IOException {
long start = System.currentTimeMillis();
System.out.println("started getSound " + name);
String fullPath = this.fileService.path() + "/" + name;
File file = new File(fullPath);
byte[] fileContent = Files.readAllBytes(file.toPath());
int numBytes = fileContent.length;
long elapsed = System.currentTimeMillis() - start;
System.out.println("elapsed for getSound " + name + "= " + elapsed);
return ResponseEntity.status(HttpStatus.OK)
.contentType(MediaType.parseMediaType("audio/mpeg"))
.header("Accept-Ranges", "bytes")
.body(Arrays.copyOfRange(fileContent, 0, numBytes));
}
在前端我有
<audio src="http://localhost:8082/api/get_sound/sound.mpeg"></audio>
元素。当我尝试通过单击时间线快进或快退到特定时间时,它起作用了。
但是,在本地主机中,通常需要不到
100ms
,当部署在 VPS 上时(前端和后端都部署在同一 VPS 上,具有相同 IP 地址的计算机上),对 get_sound
端点的每个请求大约需要 10 seconds
。
但是,获取音频文件
byte[]
所需的时间非常短 - 对于 VPS 而言平均为 20ms
,对于本地主机而言则为 10ms
。虽然 VPS 和 localhost 之间存在差异,但从绝对值来看,差异非常小,并且不会导致数秒的延迟。
我注意到每次点击
get_sound
端点后,Spring 控制台都会有这样的输出
TRACE 370406 --- [nio-8082-exec-2] o.h.r.j.i.ResourceRegistryStandardImpl : Releasing JDBC resources
在 localhost 上,它几乎在显示
elapsed
时间后立即出现,而在 VPS 上,需要几秒钟才能显示 Releasing JDBC resources
,在显示 elapsed
时间之后很长时间。我一直想知道这是否是导致 VPS 性能较差的原因。
但是,
get_sound
端点不访问SQL数据库,仅访问文件系统。而且我不确定为什么与本地主机相比,在 VPS 上释放资源需要更长的时间。
即将在视图中打开会话
因此,由于您的请求长达 10 秒,数据库连接在请求开始时打开,仅在请求完成后关闭
来源:https://www.baeldung.com/spring-open-session-in-view
我们遇到了类似的问题,导致生产中出现性能问题,并使用此功能禁用它
spring.jpa.open-in-view=false