컬렉션을 지우고 동시에 업데이트하려고합니다. 그것은 자식이 있고 컬렉션의 현재 항목을 찾고이를 비동기 적으로 삭제하면 많은 시간을 절약 할 수 있습니다.Grails, Promise API 및 두 개의 열린 세션
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()
}
}
오류 메시지는 다음과 같습니다 불법 시도가 두 개의 열린 세션
과 모음을 연결하는난 후, 포크 항목을 찾을 수 있기 때문에 컬렉션이 구축 될 수 있도록이 과정이 새로운 세션을 생성하는 추측하고있다 forking 전에 새 세션을 사용하여 항목을 삭제합니다.
현재 스레드에서 항목을 수집해야합니다. 그렇지 않으면 상태가 무엇인지 알 수 없습니다.
동기식으로 수행하는 것과 같지 않습니까? 나는 당신이 열성적으로 협회를 가져오고 삭제할 기준을 실행할 수 있다는 것을 의미합니까? – dmahapatro
quad imac에 100k 레코드를 저장하는 데 10 분이 소요됩니다. – Interlated
생성하는 것보다 삭제하는 데 시간이 오래 걸립니다. 삭제는 스레드로 35 분입니다. 원격 서버에서 다운로드, 델타 계산 및 30k를 저장하는 등의 항목 생성 - 25 분이 소요되었습니다. – Interlated