次のことを行うコントローラーアクションがあります。
データベースからドメインオブジェクトを取得します
そのオブジェクトの情報を使用して(ディスク上の)データファイルを検索し、そのファイルの内容を応答出力ストリームに書き込みます。
私の問題は、データベース接続が、データのストリーミングに必要な(長い)時間を含むアクションの期間中予約されていることです。これにより、複数のユーザーが同時にデータをストリーミングしている場合、多くの不要なデータベース接続が発生します。
def stream() {
StreamDetails sd = StreamDetails.get(params.id)
// Extract info needed to read the stream
String filename = sd.filename
// The database connection is no longer needed, how to properly release it?
// Start writing the data stream to response output
// This may take a long time and does not use a db connection
streamService.writeToOutput(filename,response.getOutputStream())
}
私が試してみました:
sessionFactory
Beanをコントローラーに注入しsessionFactory.currentSession.close()
、サービスを呼び出す前に呼び出します。ただし、これによりSessionException
、サービスを呼び出す回線が発生します。メソッドに入る前writeToOutput()
(そしてそのメソッドにはデータベース接続は必要ありません)。そして、私はセッションが本当に閉じられるべきではないと思います、ただプールに解放されます。streamService.writeToOutput(...)
サービスコールを回避するために、コードをからコントローラーにコピーして貼り付けます。この場合、すべてのコードが実行されますがSessionException
、アクションの完了後もaがスローされます。
早期に接続を適切に解放するにはどうすればよいですか?