0

DB からファイルのコンテンツをクライアント ブラウザに直接ストリーミングする必要があるシナリオがあります。

そのため、プレーンな jdbc を使用rs.getBlob()blob.getBinaryStream();てから、後で http 出力ストリームに書き込みます。

私が気づいたこと (非常に良いこと) は、ブロブを介して入力ストリームを取得すると、db 接続がデータソース プールに戻されることです。(ウェブロジック)

今、私はあなたに尋ねます、私の観察は正しいですか?長い時間がかかるダウンロードの場合、ファイルをストリーミングできるようにするために、db 接続が要求にとどまるのではないかと心配していたからです。

どうやらストリーミングが開始されると、DB 接続は使用されなくなります。

理解を深めるために、ここでいくつかのコードをモックアップします

@Trasactional
public void InputStream getIsFromBlob(....){

 ....
is = blob.getBinaryStream();
...

return is;

}

後で、このメソッドはサーブレットで使用され、http 出力ストリームにあるコンテキストを記述します。

ありがとう

4

2 に答える 2

0

コードをのぞき見しないと、あなたの考えが正しいとは思えません。接続を閉じるには (通常は finally ブロックで) 明確に接続を閉じるか、データベースで接続をアクティブにできる時間を指定する必要があります。ここから :タイムアウトして回収するのはDBサーバーです。デフォルトとその変更方法については、DB サーバー固有の管理マニュアルを参照してください。たとえば MySQL の場合、デフォルトは 28800 秒 (8 時間) の wait_timeout 設定です。

于 2013-03-12T13:22:00.730 に答える
0

あなたが言ったことは、コンテナによって接続が自動的に閉じられる可能性があるということです。接続へのすべての参照がなくなると、接続はガベージ コレクション中に接続プールに戻されます。ただし、これは通常、接続リークの主な原因であるため、通常は悪いプログラミング手法と見なされます。最後にブロックを介して接続が必要ない場合はいつでも接続を閉じることをお勧めします。

あなたの最初の質問に対して、あなたの観察は正しいと思います。まず、バイナリ入力ストリームを介して BLOB からコンテンツを読み取ります。このストリーミングには DB 接続が必要です。しかし、入力ストリームからの読み取りが完了したら、DB 接続はもう必要ありません。あなたの場合、メソッドが存在し、ガベージ コレクションが開始され、接続がプールに戻されます。後で、HttpOutputStream を介してブラウザにバイナリ コンテンツ ストリーミングを書き込みます。このストリーミングは DB とは関係ありません。

繰り返しになりますが、ガベージ コレクションに依存して接続を接続プールに返さないことを強くお勧めします。

于 2013-03-12T19:44:04.947 に答える