我正在使用最新版本的spring boot开发一个宁静的服务。 这是一个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个Obsidians实例。
Hibernate仅花费了我300毫秒,而JSON序列化(加上nio和网络传输)花费了我30秒!
是什么原因导致杰克逊这么慢?
btw:30秒钟如何找到它:我在浏览器ajax中对其进行测量。
答案 0 :(得分:1)
简短答案:杰克逊很快。
长答案:
对不起,我犯了一个大错误。 POJO序列化不是我想的那么简单,它扩展了一些基本实体类,并且该基类序列化在数据库查询中做得很慢。
如果遇到问题,请仔细检查POJO。
set show-sql = true将帮助您找出问题所在。
旧错误:
为了证明杰克逊真的很慢,我在这里添加一些代码:
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。 (仍然太慢)