Spring Boot 音频端点:在 VPS 上释放 JDBC 资源慢得多,在 localhost 上释放速度快

问题描述 投票:0回答:1

我有这个代码在

@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 上释放资源需要更长的时间。

java spring spring-boot performance hibernate
1个回答
0
投票

即将在视图中打开会话

因此,由于您的请求长达 10 秒,数据库连接在请求开始时打开,仅在请求完成后关闭

来源:https://www.baeldung.com/spring-open-session-in-view

  1. Spring 在请求开始时打开一个新的 Hibernate Session。这些Session不一定连接到数据库。
  2. 每次应用程序需要会话时,它都会重用已经存在的会话。
  3. 在请求结束时,同一个拦截器会关闭该会话。

我们遇到了类似的问题,导致生产中出现性能问题,并使用此功能禁用它

spring.jpa.open-in-view=false

© www.soinside.com 2019 - 2024. All rights reserved.