grails - Grails,Promise API和两个公开 session

标签 grails asynchronous gpars

我正在尝试清除一个集合并同时对其进行更新。它有 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/

相关文章:

java - Cucumber-jvm线程安全吗?

grails - 使用 Grails 2.1 调用 grails war 时出现奇怪的 Log4J 错误

json - 在 Grails 2.3.x 的域类上更改 @Resource 结果的 max 属性的默认值

grails - 是否可以破解spring-security-core插件@Secured批注,以能够引用提供给 Controller 的请求参数?

parsing - 使用给定信息解析字符串

收集结果的 C# ActionBlock 等价物

c# - 如何在不刷新页面的情况下显示不同的值 MVC C#

python - 跨多进程共享基于异步等待协程的复杂对象

groovy - GPars:WAITING Actor 完成

java - 如何创建一个绝妙的 Actor,除非停止,否则它会一直执行