我正在尝试清除一个集合并同时对其进行更新。它有 child ,找到集合中的当前项目并异步删除它们将为我节省很多时间。
步骤1.在集合中找到所有项目。
第2步。一旦我知道项目是什么,请派一个进程删除它们。
def memberRedbackCriteria = MemberRedback.createCriteria()
// #1 Find all the items in the collection.
def oldList = memberRedbackCriteria.list { fetchMode("memberCategories", FetchMode.EAGER) }
// #2 Delete them.
Promise deleteOld = task {
oldList.each { MemberRedback rbMember ->
rbMember.memberCategories.clear()
rbMember.delete()
}
}
错误消息是:非法尝试将一个集合与两个打开的 session 相关联
我猜是因为找到项目然后进行 fork ,所以创建了一个新 session ,以便在派生之前构建集合,并使用新 session 来删除项目。
我需要收集当前线程中的项目,否则我不确定状态是什么。
最佳答案
请注意,对所有删除使用一个异步任务实际上是在单个线程中连续运行所有删除操作。假设您的数据库可以处理多个连接并可以对表进行并发修改,则可以使用PromiseList并行执行删除操作,如下所示(请注意,下面是未经测试的代码)。
def deletePromises = new PromiseList()
redbackIds.each { Long rbId ->
deletePromises << MemberRedback.async.task {
withTransaction {
def memberRedbackCriteria = createCriteria()
MemberRedback memberRedback = memberRedbackCriteria.get {
idEq(rbId)
fetchMode("memberCategories", FetchMode.EAGER) }
memberRedback.memberCategories.clear()
memberRedback.delete()
}
}
}
deletePromises.onComplete { List results ->
// do something with the results, if you want
}
deletePromises.onError { Throwable err ->
// do something with the error
}
关于grails - Grails,Promise API和两个公开 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19696222/