使用groovy actor来最大化数据库的吞吐量?

时间:2010-12-16 10:04:14

标签: java database concurrency groovy parallel-processing

我正在使用GPars库,同时努力提高匹配系统的可扩展性。我希望能够在同时处理结果的同时查询数据库并立即查询数据库。瓶颈是从数据库中读取数据,因此我希望数据库忙于全职工作,同时在可用时异步处理结果。我意识到我可能对演员框架如何运作有一些基本的误解,我很乐意被纠正!

在伪代码中,我试图执行以下操作:

定义两个actor,一个用于针对数据库运行选择,另一个用于处理记录。

  1. queryActor查询数据库并将结果发送到processorActor
  2. queryActor会立即再次查询数据库,而无需等待processorActor完成
  3. 我可以在不使用actor的情况下实现简单的用例,但我的最终目标是让一个actor池始终处理具有可能不同数据源的新查询,以便一般地增加系统的吞吐量。

    处理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
        }
      }
    

2 个答案:

答案 0 :(得分:1)

我建议您查看GPars用户指南的Dataflow Concurrency部分中的数据流队列。您可能会发现Dataflows为您手头的问题提供了更好/更清晰的抽象。数据流也可以与演员一起使用。

我认为无论是演员还是数据流都可以在这种情况下工作,并且认为决定取决于哪一个提供的抽象更接近你想要完成的。对我来说,任务,队列,数据流的概念似乎更接近术语。

答案 1 :(得分:0)

经过一些研究后,我发现Gpars中的DataFlow并发内容实际上是Actor支持的built on top。 gpars java demo发行版中的DataflowOperatorTest(我需要做一个java实现)似乎是我需要做的很好的匹配。主线程等待填充多个流输入,在我的例子中是并行数据库查询。

相关问题