1

次のことを行うコントローラーアクションがあります。

  1. データベースからドメインオブジェクトを取得します

  2. そのオブジェクトの情報を使用して(ディスク上の)データファイルを検索し、そのファイルの内容を応答出力ストリームに書き込みます。

私の問題は、データベース接続が、データのストリーミングに必要な(長い)時間を含むアクションの期間中予約されていることです。これにより、複数のユーザーが同時にデータをストリーミングしている場合、多くの不要なデータベース接続が発生します。

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())
}

私が試してみました:

  1. sessionFactoryBeanをコントローラーに注入しsessionFactory.currentSession.close()、サービスを呼び出す前に呼び出します。ただし、これによりSessionException、サービスを呼び出す回線が発生します。メソッドに入る前writeToOutput()(そしてそのメソッドにはデータベース接続は必要ありません)。そして、私はセッションが本当に閉じられるべきではないと思います、ただプールに解放されます。

  2. streamService.writeToOutput(...)サービスコールを回避するために、コードをからコントローラーにコピーして貼り付けます。この場合、すべてのコードが実行されますがSessionException、アクションの完了後もaがスローされます。

早期に接続を適切に解放するにはどうすればよいですか?

4

1 に答える 1

-1

dataSource を注入しようとしましたか? DataSourceUtils を使用して新しい接続を作成し、それを使用してファイル名を取得できます。その後、この接続を手動で close() できます。

この接続を gorm と組み合わせて使用​​できるかどうかはわかりません。そのため、カスタム SQL クエリも作成する必要があるかもしれません。

于 2012-10-19T12:27:11.447 に答える