spring - 提前释放 Grails 数据库连接

标签 spring hibernate grails

我有一个执行以下操作的 Controller 操作:

  • 从数据库中获取域对象
  • 使用该对象的信息来查找数据文件(在磁盘上)并将该文件的内容写入响应输出流。

  • 我的问题是数据库连接是在操作期间保留的,包括流式传输数据所需的(长时间)时间。当有多个用户同时流式传输数据时,这会导致大量不必要的数据库连接。
    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())
    }
    

    我试过了:
  • 注入(inject)sessionFactory bean 到 Controller 并调用 sessionFactory.currentSession.close()在调用服务之前。然而,这会导致 SessionException在线调用服务,即。在进入writeToOutput()之前方法(并且该方法中的任何内容都不需要数据库连接)。而且我认为 session 不应该真正关闭,只是释放到池中。
  • streamService.writeToOutput(...) 复制粘贴代码到 Controller 以避免服务调用。在这种情况下,所有代码都被执行,但 SessionException Action 完成后仍然抛出。

  • 如何正确提前释放连接?

    最佳答案

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

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

    关于spring - 提前释放 Grails 数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12971451/

    相关文章:

    grails - 使用Grails Spring Security插件登录的其他字段

    grails - Grails的KahaDb属性

    java - 从spring 2.5开始如何调用restful服务

    java - 根据请求创建 Hibernate-Session

    java - 尽管数据在数据库中,查询未返回结果

    java - JBoss/EJB 与对称 DS

    grails - GORM createCriteria 和 list 不返回相同的结果 : what can I do?

    java - 属性 'driverClassName' 抛出异常;嵌套异常是 java.lang.IllegalStateException : Could not load JDBC driver class

    javascript - 使用 JavaScript 发送删除请求

    java - 具有超过10个参数的Spring Data Mongo