Java spring boot RestController JSON序列化花费了太多时间
我正在使用最新版本的SpringBoot开发一个restful服务。 这是一个RestController:Java spring boot RestController JSON序列化花费了太多时间,java,spring,jackson,Java,Spring,Jackson,我正在使用最新版本的SpringBoot开发一个restful服务。 这是一个RestController: @GetMapping(path = "/table") public Iterable<Obsidian> getReactTable(@RequestParam Long orderId) { long start = System.currentTimeMillis(); ArrayList<Obsidian
@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;
}
}
@GetMapping(path=“/table”)
公共Iterable getReactTable(@RequestParam Long orderId){
长启动=System.currentTimeMillis();
ArrayList结果=新建ArrayList();
用于(黑曜石obs:obsidianRepo.findByOrder(订单)){
结果:添加(obs);
}
long end=System.currentTimeMillis();
//只需300毫秒
//System.out.println(结束-开始);
返回结果;
}
}
结果列表总共有大约500个黑曜石实例
Hibernate只花了我300毫秒,JSON序列化(加上nio和web传输)花了我30秒
是什么原因导致杰克逊这么慢
顺便说一句:我是如何在30秒内找到它的:我在浏览器ajax中测量它。简短回答:杰克逊很快
@Test
public void testJackson() throws JsonProcessingException {
Obsidian obs = new Obsidian();
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(obs);
}
长答案:
我不得不说对不起,我犯了个大错。POJO序列化并不像我想象的那么简单,它扩展了一些基本实体类,而基类序列化在数据库查询中做得很慢
如果你遇到这个问题,仔细检查你的POJO
设置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);
我还在JUnit测试中添加了一个测试,它需要0.070才能完成
作为Gson比较:
@Test
public void testJackson() throws JsonProcessingException {
Obsidian obs = new Obsidian();
Gson gson = new Gson();
gson.toJson(obs);
}
Gson仅需0.018秒。(仍然太慢)简短回答:杰克逊很快 长答案: 我不得不说对不起,我犯了个大错。POJO序列化并不像我想象的那么简单,它扩展了一些基本实体类,而基类序列化在数据库查询中做得很慢 如果你遇到这个问题,仔细检查你的POJO 设置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);
我还在JUnit测试中添加了一个测试,它需要0.070才能完成
作为Gson比较:
@Test
public void testJackson() throws JsonProcessingException {
Obsidian obs = new Obsidian();
Gson gson = new Gson();
gson.toJson(obs);
}
Gson仅需0.018秒。(仍然太慢)顺便说一句,我可以确保杰克逊的速度变慢。实体黑曜石大约有15个简单属性,当我使用@JsonIgnore忽略POJO黑曜石中的某些字段时,它会变得更快。您是否使用
延迟加载
?您确定在序列化期间没有对外部系统进行额外调用吗?一般来说,Jackson
将简单的POJO
模型序列化为String
时速度很快。POJO黑曜石中的所有属性都是简单字符串或长字符串或布尔值,没有多个,没有一个多个,没有延迟加载。我正在考虑使用Gson,看看它是否更快……顺便说一句,我可以确保Jackson的速度变慢。实体黑曜石大约有15个简单属性,当我使用@JsonIgnore忽略POJO黑曜石中的某些字段时,它会变得更快。您是否使用延迟加载
?您确定在序列化期间没有对外部系统进行额外调用吗?一般来说,Jackson
将simplePOJO
模型序列化为String
时速度很快。POJO-Obsidian中的所有属性都是简单字符串或长字符串或布尔值,没有多个,没有一个多个,没有延迟加载。我正在考虑使用Gson来看看它是否更快……我看不到你在哪里记录“开始”也许这应该是实体加载所需的时间,最好使用CPU探查器(JProfiler或Yourkit)并指出问题所在。@hunter我在很多web项目中使用spring boot RestController,从来没有觉得Jackson在一个不太长的列表上会很慢,今天,我的一个同事说,嘿,500条记录表怎么可以这样呢(没有服务器端分页,因为我这次使用react table)速度太慢了。现在我将调试ObjectMapper,看看它运行了多少条指令来为一个POJO编写JSON字符串。我看不到您在哪里记录“开始”可能是实体加载所用的时间,最好使用CPU探查器(JProfiler或Yourkit)并指出问题所在。@hunter我在很多web项目中都使用spring boot RestController,从来没有觉得Jackson在一个不太长的列表中会慢,今天,我的一个同事说,嘿,500条记录表怎么可以(因为我这次使用react表,所以没有服务器端分页)现在我将调试ObjectMapper,看看它运行了多少指令来为一个POJO编写JSON字符串。