我有一个包含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()
前进
我尝试过搜索,但仍然没有任何运气,在这方面的任何方向帮助都非常感谢。