Spring引导流大型JSON数据集

时间:2017-08-29 15:14:14

标签: java angularjs spring-boot jackson java-stream

我有一个包含1400000行的表,一个控制器返回所有这些记录JSON格式和AngularJS前端,它们遍历这些记录然后输出pdf文件。

正如预期的那样,调用此控制器会导致高CPU使用率并导致GUI缓慢甚至无法访问。在搜索可能的解决方法时,我遇到了关于使用Stream Stream JSON output in Spring MVC 。但是,我无法使其工作,我所做的是:

Repository接口中声明以下方法:

@Query(value = "SELECT * FROM subscriber", nativeQuery = true)
public Stream<Subscriber> findAllByCustomQueryAndStream();

然后,从Controller这样调用此方法

@RequestMapping(value = { "/subscriber/all", "/api/subscriber/all" })
public Stream<Subscriber> getAll() {        
    return subscriberRepo.findAllByCustomQueryAndStream();
}

这样MappingJackson2HttpMessageConverter

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper objectMapper = jsonConverter.getObjectMapper();
    SimpleModule module = new SimpleModule("Stream");
    module.addSerializer(Stream.class, new JsonSerializer<Stream>() {

    @Override
    public void serialize(Stream value, JsonGenerator gen, SerializerProvider serializers)
        throws IOException, JsonProcessingException {
        serializers.findValueSerializer(Iterator.class, null).serialize(value.iterator(), gen, serializers);

        }
    });

    objectMapper.registerModule(module);
    jsonConverter.setObjectMapper(objectMapper);
    return jsonConverter;
}

但是,当我致电/subscriber/all时,我会遇到以下异常:

  

org.springframework.dao.InvalidDataAccessApiUsageException:您正在尝试执行流式查询方法而没有保持连接打开的周围事务,以便实际可以使用Stream。确保使用流的代码使用@Transactional或任何其他方式声明(只读)事务。

如果我使用Stream<Subscriber> getAll()注释@Transactional(readOnly = true)方法,我会遇到以下异常:

  

2017-08-29 23:12:08,022 [] [http-nio-8089-exec-10] WARN - org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL错误:0,SQLState:S1000

     

2017-08-29 23:12:08,023 [] [http-nio-8089-exec-10] ERROR - org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ResultSet关闭后不允许操作

     

2017-08-29 23:12:08,029 [] [http-nio-8089-exec-10] WARN - org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - 无法写入HTTP消息:org。 springframework.http.converter.HttpMessageNotWritableException:无法写入内容:无法使用next();嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:无法使用next()

前进

我尝试过搜索,但仍然没有任何运气,在这方面的任何方向帮助都非常感谢。

0 个答案:

没有答案