gpt4 book ai didi

java - spring boot RestController JSON序列化花费太多时间

转载 作者:行者123 更新时间:2023-12-02 09:57:48 25 4
gpt4 key购买 nike

我正在使用最新版本的 Spring Boot 开发一个 Restful 服务。这是一个 RestController:

@GetMapping(path = "/table")
public Iterable<Obsidian> getReactTable(@RequestParam Long orderId) {
long start = System.currentTimeMillis();
ArrayList<Obsidian> results = new ArrayList<Obsidian>();
for (Obsidian obs : obsidianRepo.findByOrder(order)) {
results.add(obs);
}
long end = System.currentTimeMillis();
// Only cost about 300ms
// System.out.println(end - start);
return results;
}
}

结果列表总共有大约 500 个黑曜石实例。

Hibernate 仅花费了我 300 毫秒,而 JSON 序列化(加上 nio 和 Web 传输)花费了我 30 秒!

什么可能导致 jackson 如此缓慢?

顺便说一句:我如何在 30 秒内找到它:我在浏览器 ajax 中测量它。

最佳答案

简短回答: jackson 速度很快。

长答案:

我必须说对不起,我犯了一个很大的错误。 POJO序列化并不像我想象的那么简单,它扩展了一些基实体类,而基类序列化在数据库查询中做了一些缓慢的事情。

如果您遇到这个问题,请仔细检查您的 POJO。

set show-sql=true 将帮助您找出问题所在。

老错误:

为了证明jackson确实很慢,我在这里添加一些代码:

        long start = System.currentTimeMillis();
ObjectMapper mapper = new ObjectMapper();
ArrayList<Obsidian> results = new ArrayList<Obsidian>();
for (Obsidian obs : obsidianRepo.findByOrder(order)) {
results.add(obs);
mapper.writeValueAsString(obs);
}
long end = System.currentTimeMillis();
System.out.println(end - start);

正如你所看到的,我在for循环中手动调用jackson com.fasterxml.jackson.databind.ObjectMapper来查看花费了多少时间,结果是:33247ms,这正是我在浏览器ajax中测量的时间.

@Test 
public void testJackson() throws JsonProcessingException {

Obsidian obs = new Obsidian();
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(obs);
}

我还在JUnit Test中添加了一个Test,花费了0.070s完成。

作为 Gson 比较:

@Test 
public void testJackson() throws JsonProcessingException {
Obsidian obs = new Obsidian();
Gson gson = new Gson();
gson.toJson(obs);
}

Gson仅需0.018s。 (还是太慢)

关于java - spring boot RestController JSON序列化花费太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55865181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com