【问题标题】:Releasing Grails database connection early提前释放 Grails 数据库连接
【发布时间】:2012-10-19 09:39:07
【问题描述】:

我有一个执行以下操作的控制器操作:

  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. sessionFactory bean 注入控制器并在调用服务之前调用sessionFactory.currentSession.close()。但是,这会导致调用服务的线路上出现SessionException,即。在输入writeToOutput() 方法之前(并且该方法中的任何内容都不需要数据库连接)。而且我认为会话不应该真正关闭,只是释放到池中。

  2. 将代码从streamService.writeToOutput(...) 复制粘贴到控制器以避免服务调用。在这种情况下,所有代码都会被执行,但在操作完成后仍会抛出 SessionException

如何正确提前释放连接?

【问题讨论】:

    标签: spring hibernate grails


    【解决方案1】:

    您是否尝试过注入数据源?您可以使用 DataSourceUtils 创建一个新连接,然后您可以使用它来获取文件名。然后您可以手动关闭()此连接。

    我不知道您是否可以将此连接与 gorm 结合使用,因此您可能还必须创建自定义 sql 查询。

    【讨论】:

    • 关闭整个数据源?没有。
    • 哎呀,当然不是。我想到了使用数据源创建的连接。我已经澄清了这一点。但无论如何,这个解决方案并不是最好的。
    • 我是这样工作的:使用 DataSourceUtils.getConnection(dataSource) 获取连接,编写自定义 sql 语句,然后在不需要连接后关闭连接。我不得不将输出写入代码复制粘贴到控制器中,因为调用服务方法会创建一个数据库连接。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2017-12-24
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    相关资源
    最近更新 更多