【发布时间】:2010-12-16 10:04:13
【问题描述】:
我正在使用 GPars 库,同时努力提高匹配系统的可扩展性。我希望能够在同时处理结果的同时查询数据库并立即查询数据库。瓶颈是从数据库中读取数据,所以我想让数据库保持全时忙碌,同时在结果可用时异步处理结果。我意识到我可能对演员框架的工作方式有一些基本的误解,我很乐意得到纠正!
在伪代码中,我正在尝试执行以下操作:
定义两个参与者,一个用于对数据库运行选择,另一个用于处理记录。
- queryActor 查询数据库并将结果发送到 processorActor
- queryActor 立即再次查询数据库,无需等待 processorActor 完成
我或许可以在不使用参与者的情况下实现简单的用例,但我的最终目标是拥有一个参与者池,该池始终处理具有潜在不同数据源的新查询,以便总体上提高系统的吞吐量。
处理Actor的速度总是比数据库查询快得多,所以我想将来同时查询多个副本。
def processor = actor {
loop {
react {querySet ->
println "processing recordset"
if (querySet instanceof Object[]) {
MatcherDataRowProcessor matcher = new MatcherDataRowProcessor(matchedRecords, matchedRecordSet);
matchedRecords = matcher.processRecordset(querySet);
reply matchedRecords
}
else {
println 'processor fed nothing, halting processor actor'
stop()
}
}
}
}
def dbqueryer = actor {
println "dbqueryer has started"
while (batchNum.longValue() <= loopLimiter) {
println "hitting db"
Object[] querySet
def thisRuleBatch = new MatchRuleBatch(targetuidFrom, targetuidTo)
thisRuleBatch.targetuidFrom = batchNum * perBatch - perBatch
thisRuleBatch.targetuidTo = thisRuleBatch.targetuidFrom + perBatch
thisRuleBatch.targetName = targetName
thisRuleBatch.whereClause = whereClause
querySet = dao.getRecordSet(thisRuleBatch)
processor.send querySet
batchNum++
}
react { processedRecords ->
processor.send false
}
}
【问题讨论】:
标签: java database concurrency groovy parallel-processing