Grails、Promise API和两个开放会话
我正在尝试清除一个集合,同时更新它。它有子项,在集合中查找当前项并异步删除它们将节省我很多时间 第一步。查找集合中的所有项目。 第二步。一旦我知道了这些项目是什么,我就开始一个删除它们的过程Grails、Promise API和两个开放会话,grails,asynchronous,gpars,Grails,Asynchronous,Gpars,我正在尝试清除一个集合,同时更新它。它有子项,在集合中查找当前项并异步删除它们将节省我很多时间 第一步。查找集合中的所有项目。 第二步。一旦我知道了这些项目是什么,我就开始一个删除它们的过程 def memberRedbackCriteria = MemberRedback.createCriteria() // #1 Find all the items in the collection. def oldList = memberRedbackCriteria.list {
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()
}
}
错误消息是:非法尝试将集合与两个打开的会话关联
我猜,因为我找到了项目,然后fork,这将创建一个新会话,以便在fork之前构建集合,并使用一个新会话删除项目
我需要收集当前线程中的项目,否则我不确定状态会是什么 找到了解决办法。将ID放入列表中,并作为异步闭包的一部分收集它们 还请注意,您不能根据重用标准
请注意,对所有删除使用一个异步任务实际上是在单个线程中串联运行所有删除操作。假设您的数据库可以处理多个连接和表的并发修改,您可以使用PromiseList来并行删除,如下所示(请注意,下面是未测试的代码)
def deletePromises=newpromiseList()
redbackIds.each{Long rbId->
删除承诺
//如果你想的话,对结果做点什么
}
DeletePromissions.onError{可丢弃的错误->
//对这个错误做点什么
}
这与同步操作不一样吗?我的意思是,你可以运行这些条件,急切地获取关联,然后删除它们?似乎可以为我节省10分钟,在quad imac上保存100k条记录。删除比生成需要更长的时间。删除一个线程需要35分钟。创建项目,包括从远程服务器下载、计算增量并保存其中的30k项,这需要25分钟。生成新版本时删除内容的算法运行良好。托管公司抱怨我使用基于光标的删除,而不仅仅是从中删除。我也没有对每个查询的异步解决方案进行计时或检查。看看额外的分叉产生了多少开销是很有趣的。
// #1 find the ids
def redbackIds = MemberRedback.executeQuery(
'select mr.id from MemberRedback mr',[])
// #2 Delete them.
Promise deleteOld = task {
redbackIds.each { Long rbId ->
def memberRedbackCriteria = MemberRedback.createCriteria()
MemberRedback memberRedback = memberRedbackCriteria.get {
idEq(rbId)
fetchMode("memberCategories", FetchMode.EAGER) }
memberRedback.memberCategories.clear()
memberRedback.delete()
}
}
deleteOld.onError { Throwable err ->
println "deleteAllRedbackMembers An error occured ${err.message}"
}
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
}