春季启动RestController JSON序列化花费太多时间

时间:2019-04-26 09:59:33

标签: java spring jackson

我正在使用最新版本的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中对其进行测量。

1 个答案:

答案 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。 (仍然太慢)