2012-02-19 5 views
1

私は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はあまり役に立たなかったことを確認しました。

おかげで、 ドロン

答えて

0

はい、示すように、あなたのコードは動作しません。メソッドで匿名の内部クラスを作成し、それを戻りオブジェクトとしてコンテナに渡しました。新しいクラスの書き込みオブジェクトは、メソッドが既に完了してから実際に呼び出されることはありません。その時点で、すでにすべての接続が閉じられています。

概念的には、データベースから直接ストリームを作成しようとするのは良い考えではないでしょう。クライアントが入力ストリームを消費することを決定した時間の間、接続を開いたままにしたくない場合。最も良いことは、データをメモリに読み込んで、そのデータをクライアントにストリームすることです。

+0

もちろん、私のコードはうまくいかないので、ここで質問を投稿しました:-)。ところで、コードは動作します。私は接続プールを使用しているので、接続が本当に閉じることはないので、私はそれを推測しています。とにかく、ストロングブロブは私にとって共通の操作としてよく聞こえました。私はそれがジャージーによって支持されるかもしれないと思った。しかし、実際にクライアントに依存している期間、接続を開いたままにするというあなたの主張は、ケースを勝ち取ると思います。 – daramasala

+0

@Perceptionしかし、データベースからのデータが巨大なデータセット、例えば100万レコード前後であれば、データベースから直接ストリーミングするのは良いでしょうか? –

+0

ワンショットで数百万のレコードを返すことは、これまで書いたシステムのユースケースではありません。 ***しかし、***あなたはあなたがする必要があるその場合に実行すると言うと、一度にすべてをストリーミングしようとするのとは対照的に、(制限を使用して)データをページする必要があります。 – Perception

関連する問題