尽早发布Grails数据库连接

时间:2012-10-19 09:39:07

标签: spring hibernate grails

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

  1. 从数据库中获取域对象

  2. 使用该对象的信息查找数据文件(在磁盘上),并将该文件的内容写入响应输出流。

  3. 我的问题是数据库连接是在操作期间保留的,包括流式传输数据所需的(长)时间。当有多个用户同时流式传输数据时,这会导致大量不必要的数据库连接。

    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

    3. 如何及早正确释放连接?

1 个答案:

答案 0 :(得分:-1)

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

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