【发布时间】:2012-10-19 09:39:07
【问题描述】:
我有一个执行以下操作的控制器操作:
从数据库中获取域对象
使用该对象的信息来查找(在磁盘上)数据文件并将该文件的内容写入响应输出流。
我的问题是数据库连接是在操作期间保留的,包括流式传输数据所需的(长时间)时间。当有多个用户同时流式传输数据时,这会导致大量不必要的数据库连接。
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())
}
我试过了:
将
sessionFactorybean 注入控制器并在调用服务之前调用sessionFactory.currentSession.close()。但是,这会导致调用服务的线路上出现SessionException,即。在输入writeToOutput()方法之前(并且该方法中的任何内容都不需要数据库连接)。而且我认为会话不应该真正关闭,只是释放到池中。将代码从
streamService.writeToOutput(...)复制粘贴到控制器以避免服务调用。在这种情况下,所有代码都会被执行,但在操作完成后仍会抛出SessionException。
如何正确提前释放连接?
【问题讨论】: