簡體   English   中英

Spring Boot RestController JSON序列化花費太多時間

[英]spring boot RestController JSON serialization cost too much time

我正在使用最新版本的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秒鍾!

是什么導致傑克遜這么慢?

順便說一句:我怎么發現它30秒:我在瀏覽器ajax中對其進行測量。

簡短的回答:傑克遜很快。

長答案:

我不得不說對不起,我犯了一個大錯誤。 POJO序列化並不像我想的那么簡單,它擴展了一些基本實體類,並且該基類序列化在數據庫查詢中做得很慢。

如果您遇到問題,請仔細檢查您的POJO。

設置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。 (仍然太慢)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM