私はCLOBフィールド(MySQL MediumText)を持つテーブルを持っています。Jersey - ResultSetからストリームを返す
入力ストリームをその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
メソッドでdbリソースを閉じることができます。しかし、それはまあまあではありません - 私はいくつかの外の容器が私の資源を閉じることを許可しています。
私が考えることができる最後のアイデアは、ストリーム全体をメモリに読み込んで送信することです。私はもちろんそれをやりたくはありません。
だれでも、もっと良いアイデアはありますか?
Return a file using Java Jerseyはあまり役に立たなかったことを確認しました。
おかげで、 ドロン
もちろん、私のコードはうまくいかないので、ここで質問を投稿しました:-)。ところで、コードは動作します。私は接続プールを使用しているので、接続が本当に閉じることはないので、私はそれを推測しています。とにかく、ストロングブロブは私にとって共通の操作としてよく聞こえました。私はそれがジャージーによって支持されるかもしれないと思った。しかし、実際にクライアントに依存している期間、接続を開いたままにするというあなたの主張は、ケースを勝ち取ると思います。 – daramasala
@Perceptionしかし、データベースからのデータが巨大なデータセット、例えば100万レコード前後であれば、データベースから直接ストリーミングするのは良いでしょうか? –
ワンショットで数百万のレコードを返すことは、これまで書いたシステムのユースケースではありません。 ***しかし、***あなたはあなたがする必要があるその場合に実行すると言うと、一度にすべてをストリーミングしようとするのとは対照的に、(制限を使用して)データをページする必要があります。 – Perception