0

我正在运行 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
        }
    }
}

任何帮助将不胜感激。

4

2 回答 2

1

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

def session = ctx.sessionFactory.currentSession
于 2012-12-14T16:56:10.467 回答
0

要访问会话,您可以使用 withSession 闭包,如下所示:

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

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

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

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

于 2012-12-14T17:13:20.177 回答