Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring boot RestController JSON序列化花费了太多时间_Java_Spring_Jackson - Fatal编程技术网

Java spring boot RestController JSON序列化花费了太多时间

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

我正在使用最新版本的SpringBoot开发一个restful服务。 这是一个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;
        }
    }
@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
将simple
POJO
模型序列化为
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字符串。