K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2046] Re:flush()について
返信


投稿者:(ぱ)こと管理人
2017/12/13 01:39:52

Link:
>すごく基本的な質問かもしれないですが、たとえば「メモリ上にだけ持っていて
>ディスクに書き出していないデータがあるかもしれないのでflush」という
>イメージは分かるのですが、このサンプルの場合はメモリ上のデータの
>やり取りだけなので、flushを何のために行っているのか分かりませんでした。

このサンプルの場合はメモリ上のデータのやり取りだけですが、
それは、Henacatが手抜きのためにレスポンスボディをいったんすべて
メモリに乗せているからであり、これでは、巨大なレスポンスを返す際には
メモリが無駄になります。場合によっては、レスポンスデータを作りながら
どんどんクライアントに返してしまいたいケースもあるでしょう。
その場合、クライアントへのデータの返却を始めてしまったら、
もうレスポンスヘッダの変更はできませんから、途中でエラーが起きても
ステータスとして500とかを返すことはできず、200 OKを返すことになって
しまいますが、それでもいいからクライアントへのデータ返却を始めてしまいたい、
というニーズはあり得ます。それに対応するために、サーブレットAPIでは
「コミット」という概念を導入しています(p.119)。
http://mergedoc.osdn.jp/tomcat-servletapi-5-ja/javax/servlet/ServletResponse.html#getWriter()

その場合、HttpServletResponseのgetWriter()で得られるPrintWriterは、
バッファリングする方がよいでしょう。相手はネットワークだからです。
このように、このPrintWriterはバッファリングする(ようになる)可能性もあるため、
ここではflush()しています。
いずれにしても、バッファリングするしないはPrintWriterの実装詳細に
属することでしょうから、flush()する方が堅実なコーディングではないかと
思います。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[ より新しい投稿] [ より古い投稿]