我正在运行 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
}
}
}
任何帮助将不胜感激。
应用程序上下文将在迁移中自动提供,ctx
。 您可以像这样获得会话:
def session = ctx.sessionFactory.currentSession
要访问会话,您可以使用 with Session 闭包,如下所示:
Book.withSession { session ->
session.clear()
}
但是,这可能不是应用堆空间不足的原因。如果数据量很大,则
def fileIds = sql.rows("""SELECT id FROM erp_file""")
for (row in fileIds) {
..........
}
会占用您的空间。尝试使用分页处理数据。不要一次加载所有数据。