我想创建一个 Java Spring Boot 项目,为客户端提供 REST API。对 API 的请求将被转发(经过一些更改)到数据库。我想收到数据库的响应并将其转发给客户端。
我知道如何针对一个简单的请求执行此操作,从数据库中获取单个结果。但是数据库返回 json 行流,我想将其作为流直接传递给客户端。所以我不想收集流直到它结束(将其存储在内存中)然后将其发送到客户端。我可能还想对每个 json 行应用一些转换或过滤。存储几行作为缓存的缓冲区就可以了。
如果我理解正确,你想从
ResultSet
一次返回一行 - Spring Boot 提供了多种机制来执行此操作,请参阅 - https://www.baeldung.com/spring-mvc-sse-streams
一个使用
StreamingResponseBody
的简单示例可能类似于:
@Controller
public class SomeController
{
@GetMapping
public ResponseEntity<StreamingResponseBody> handleGet(@RequestParam("someParam") int someParam)
{
return new ResponseEntity(query(someParam), HttpStatus.OK);
}
private StreamingResponseBody query(int someParam)
{
return out ->
{
out.write((byte)'[');
try (
var preparedStatement = prepareStatement(someParam);
var resultSet = preparedStatement.executeQuery()
)
{
while (resultSet.next())
{
out.write(resultSet.getBytes("some_column_containing_json"));
if (!resultSet.isLast()) out.write((byte)',');
}
}
finally
{
out.write((byte)']');
}
};
}
private PreparedStatement prepareStatement(int someParam)
{
var preparedStatement = connection.prepareStatement("SELECT some_column FROM some_table WHERE some_other_column = ?");
preparedStatement.setInt(1, someParam);
return preparedStatement;
}
}
这假设您希望将 JSON 行作为 JSON 数组返回。