[英]start a Spring boot Application on ubuntu but cost too much time
[英]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.