我有一个带有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这对我没什么帮助。
谢谢, 多伦
答案 0 :(得分:0)
是的,您显示的代码无效。您在方法中创建了一个匿名内部类,然后将其作为返回对象传递给容器。在您的方法完成之后的某个时间,新类中的写入对象实际上不会被调用,当然您已经关闭了所有连接。
从概念上讲,尝试直接从数据库流式传输可能不是一个好主意。您不希望在客户端决定使用输入流的时间内保持打开连接。最好的办法是将数据读入内存,然后将数据流式传输到客户端。