首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring引导RestController JSON序列化花费了太多时间

spring引导RestController JSON序列化花费了太多时间
EN

Stack Overflow用户
提问于 2019-04-26 09:59:32
回答 1查看 1.8K关注 0票数 0

我正在使用最新版本的spring开发restful服务。下面是一个RestController:

代码语言:javascript
复制
@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中测量它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-26 10:16:16

的简短回答:杰克逊速度很快。

长答案:

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

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

set show-sql=true将帮助您发现问题。

旧错误:

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

代码语言:javascript
复制
        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中测量的时间。

代码语言:javascript
复制
@Test 
public void testJackson() throws JsonProcessingException {

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

我还在JUnit测试中添加了一个测试,它需要花费0.070秒才能完成。

作为一个Gson的比较:

代码语言:javascript
复制
@Test 
public void testJackson() throws JsonProcessingException {
    Obsidian obs = new Obsidian();
    Gson gson = new Gson();
    gson.toJson(obs);
}

Gson只花了0.018秒。(仍然太慢)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55865181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档