我正在使用最新版本的spring开发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个Obsidian实例。
Hibernate只花了我300 me,JSON序列化(加上nio和web传输)花费了我30秒!
是什么让杰克逊这么慢?
顺便说一句:我是如何在30秒内找到它的:我在浏览器ajax中测量它。
发布于 2019-04-26 10:16:16
的简短回答:杰克逊速度很快。
长答案:
我不得不说对不起,我犯了一个大错。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来查看花费了多少时间,结果是:33247 is,这正是我在browser ajax中测量的时间。
@Test
public void testJackson() throws JsonProcessingException {
Obsidian obs = new Obsidian();
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(obs);
}我还在JUnit测试中添加了一个测试,它需要花费0.070秒才能完成。
作为一个Gson的比较:
@Test
public void testJackson() throws JsonProcessingException {
Obsidian obs = new Obsidian();
Gson gson = new Gson();
gson.toJson(obs);
}Gson只花了0.018秒。(仍然太慢)
https://stackoverflow.com/questions/55865181
复制相似问题