Jersey - 从ResultSet返回流

时间:2012-02-19 10:07:28

标签: java database jersey

我有一个带有CLOB字段的表(MySQL MediumText)。

我想将输入流返回给该CLOB。 我的资源代码如下所示:

@GET
public StreamingOutput getAsStream(int id) {
  try {
    // prepare the statement object
    ResultSet rs = stmt.executeQuery();
    if (rs.next()) return new StreamingOutput() {
      public void write(OutputStream outputStream) throws ... {
        copy(rs.getBinaryStream(1), outputStream);
      }
    }
  }
  finally {
    rs.close();
    stmt.close();
    connection.close();
  }
}

哪个看起来不正确。在Jersey有机会将流写入响应之前,代码会关闭db资源(结果集,语句和连接)。

我可以在StreamingOutput.write方法中关闭数据库资源。但它也感觉不对 - 我让一些外部容器关闭我的资源。

我能想到的最后一个想法是将整个流读入内存然后发送它。我当然不想这样做。

那么,任何人都有更好的主意吗?

我检查了Return a file using Java Jersey这对我没什么帮助。

谢谢, 多伦

1 个答案:

答案 0 :(得分:0)

是的,您显示的代码无效。您在方法中创建了一个匿名内部类,然后将其作为返回对象传递给容器。在您的方法完成之后的某个时间,新类中的写入对象实际上不会被调用,当然您已经关闭了所有连接。

从概念上讲,尝试直接从数据库流式传输可能不是一个好主意。您不希望在客户端决定使用输入流的时间内保持打开连接。最好的办法是将数据读入内存,然后将数据流式传输到客户端。