【问题标题】:Grails database migration plugin - Java heap spaceGrails 数据库迁移插件 - Java 堆空间
【发布时间】:2012-12-14 16:38:18
【问题描述】:

我正在运行 grails 1.3.7 并使用 grails 数据库迁移插件版本 database-migration-1.0

我遇到的问题是我有一个迁移更改集。那就是将 blob 从表中拉出并将它们写入磁盘。在运行此迁移时,尽管我的堆空间已用完。我在想我需要刷新和清除会话以释放一些空间,但是我很难从迁移中访问会话。顺便说一句,迁移的原因是我们不再将文件存储在 oracle 中,而是将它们放在磁盘上

我试过了

SessionFactoryUtils.getSession(sessionFactory, true)

我也试过

SecurityRequestHolder.request.getSession(false)   //request in null -> not surprising

changeSet(author: "userone", id: "saveFilesToDisk-1") {
    grailsChange{
        change{
            def fileIds = sql.rows("""SELECT id FROM erp_file""")
            for (row in fileIds) {
                def erpFile = ErpFile.get(row.id)
                erpFile.writeToDisk()
                session.flush()
                session.clear()
                propertyInstanceMap.get().clear()
            }
            ConfigurationHolder.config.erp.ErpFile.persistenceMode = previousMode
        }
    }
}

我们将不胜感激。

【问题讨论】:

    标签: database grails heap-memory


    【解决方案1】:

    应用程序上下文将作为ctx 在您的迁移中自动可用。您可以像这样获得会话:

    def session = ctx.sessionFactory.currentSession
    

    【讨论】:

    • 非常感谢。我回去仔细阅读了迁移插件文档。 我自己踢>
    【解决方案2】:

    要访问会话,您可以像这样使用 withSession 闭包:

    Book.withSession { session ->
        session.clear()
    }
    

    但是,这可能不是您的应用程序堆空间不足的原因。如果数据量很大,那么

     def fileIds = sql.rows("""SELECT id FROM erp_file""")
        for (row in fileIds) {
            ..........
        } 
    

    会占用你的空间。尝试使用分页处理数据。不要一次加载所有数据。

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 2012-05-20
      • 2019-08-31
      • 1970-01-01
      • 2014-05-19
      • 2012-05-28
      • 2013-01-12
      • 2012-06-30
      相关资源
      最近更新 更多